实体框架非标识 - 无法将值NULL插入列“ID”

时间:2015-11-16 14:06:16

标签: c# sql-server entity-framework primary-key identity

我有一个主ID为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"
            });                
    }
}

就在这时我得到了一个错误

  

“无法将值NULL插入列'ID',表'dbo.Action';   列不允许空值。 INSERT失败。\ r \ n声明已经存在   封端的“

如您所见,我明确提供了ID列的值。我怀疑实体框架期望ID是一个标识列

实体类非常简单

[DataContract]
public class Action
{
    [DataMember]
    public int ID { get; set; }

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

2 个答案:

答案 0 :(得分:6)

您的迁移仅在数据库中创建表,但不会告诉实体框架ID属性不是IDENTITY列。如果您没有告诉它使用哪个属性作为主键,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; }
}

答案 1 :(得分:2)

错误是由于字段名称Id应该是主键和标识这一事实 当EF生成插入语句时,不会为该字段生成值。

您可以使用

修复它
[DataContract]
public class Action
{
    [DataMember]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID { get; set; }

    [DataMember]
    public string ActionName { get; set; }
}
相关问题