8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

实体框架非身份-无法将值 NULL 插入到“ID”列中

Prasannjeet Singh 1月前

24 0

我有一个表,其主键为 ID,此字段不是标识列。我对 Entity Framework 6 的迁移是 CreateTable( \'dbo.Action\', c => new { ID = c.Int(nulla...

我有一张表,其主键为 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 插入到表 'dbo.Action' 的列 'ID' 中;列不允许为空。INSERT 失败。\r\n该语句已终止\'

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

实体类非常简单

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

    [DataMember]
    public string ActionName { get; set; }
}
帖子版权声明 1、本帖标题:实体框架非身份-无法将值 NULL 插入到“ID”列中
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Prasannjeet Singh在本站《linq》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 该错误是由于字段名称 Id 应该是主键和身份造成的。
    当 EF 生成插入语句时不会为该字段生成值。

    您可以使用以下方法修复它

    [DataContract]
    public class Action
    {
        [DataMember]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        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 作为主键,除非另有说明。@DavidG 在下面给出了正确的答案。

返回
作者最近主题: