实体框架非标识-无法将值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; }
}
您的迁移只在数据库中创建表,但不会告诉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; }
}