为什么EF试图在id-column中插入NULL?

对不起我的英语不好。

我正在使用Entity Framework 4.0(模型优先)编写我的项目。 在项目开始时,我遇到了这个问题:我试图在数据库中插入填充的对象,但我得到一个例外:

“无法将值NULL插入列’CategoryId’,表’ForumDB.dbo.Categories’;列不允许空值.INSERT失败。语句已被终止。”

Category usingCategory = new Category("Using Forums", "usingforums", 0); using (Context) { Context.Categories.AddObject(usingCategory); Context.SaveChanges(); } 

我检查了这个对象,我确信它已经填满了。

以防万一:

 public Category(string name, string urlName, int index) { CategoryId = Guid.NewGuid(); Name = name; UrlName = urlName; CategoryIndex = index; } 

请告诉我发生了什么事? 谢谢你的帮助!

看看这个: https : //stackoverflow.com/a/5338384/171703 – entity framework可能假设您的CategoryId字段是一个标识,因此将null传递给数据库,期望它为您填充它。

我今天碰到了这个,不得不从数据库中重新生成我的EF类。

在这之后,我发现EF添加了:

 [DatabaseGenerated(DatabaseGeneratedOption.None)] public int Id { get; set; } 

此“Id”字段曾经是SQL中的标识列,但已更改为应用程序分配。

我想如果你没有那个属性,EF实际上不会将ID发送到数据库(“约定优于配置”)

我用int Id作为PK创建了表,但忘了设置“Identity Specification”= True

今天遇到了同样的问题。

以下是我弄清楚这个问题的方法。

我最初在列中添加了标识种子,但之后我删除了它。 所以我没有意识到,首先修改代码中的列定义,Id

属性(x => x.Id).HasColumnName(@“Id”)。HasColumnType(“int”)。IsRequired();

所以Entity框架发现它是一个Identity列,我得到了上面的例外。

要解决此问题,请添加“ HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None) ”,以便最终的部分类似于:

属性(x => x.Id).HasColumnName(@“Id”)。HasColumnType(“int”)。IsRequired()。HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);

尝试将其添加到模型类.cs文件中:

  [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public int CategoryId { get; set; } 

或者将列CategoryId更改为identity:

  CategoryId int IDENTITY(1,1)