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

本文关键字:NULL 插入列 ID 框架 标识 实体 | 更新日期: 2023-09-27 18:22:09

我有一个主键为ID的表,该字段不是标识列。我对实体框架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插入表'dbo.Action'的列'ID'中;列不允许为null。INSERT失败。''''r''n声明已经已终止"

正如您所看到的,我清楚地为ID列提供了一个值。我的怀疑是实体框架期望ID是一个身份列

Entity类是非常简单的

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

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

您的迁移只在数据库中创建表,但不会告诉Entity Framework 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; }
}

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

你可以使用来修复它

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