我有一个带有ID主键的表,该字段不是标识列。我对Entity Framework 6的迁移是

 CreateTable(
   "dbo.Action",
    c => new
    {
       ID = c.Int(nullable: false, identity: false),
       ActionName = c.String(maxLength: 50),
    })
    .PrimaryKey(t => t.ID);

这一切对我来说直截了当。然后,我有一种方法可以播种一些数据:
public static void Seed(this DbSet<Action> entitySet)
{
    MainContext dbCtx = DataRepositoryBase<Action>.GetContext(entitySet) as MainContext;
    if (dbCtx != null)
    {
            entitySet.Add(new Action()
            {
                ID = 1,
                ActionName = "Test"
            });
    }
}

在这一点上我得到一个错误



如您所见,我显然为ID列提供了一个值。我怀疑 Entity Framework 期望ID为“身份”列

实体类非常简单
[DataContract]
public class Action
{
    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string ActionName { get; set; }
}

最佳答案

您的迁移只会在数据库中创建表,而不会告诉Entity Framework ID属性不是IDENTITY列。如果您不告诉EF将哪个属性用作主键,则EF选择一个称为ID的属性,但您还需要告诉EF它不是IDENTITY列,请使用DatabaseGenerated属性来执行此操作:

[DataContract]
public class Action
{
    [DataMember]
    [Key] //This isn't technically needed, but I prefer to be explicit.
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID { get; set; }

    [DataMember]
    public string ActionName { get; set; }
}

10-04 22:22
查看更多