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

Kov*_*xey 24 .net c# entity-framework entity-framework-4

对不起我的英语不好.

我正在使用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();
    }
Run Code Online (Sandbox Code Playgroud)

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

以防万一:

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

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

aki*_*ler 42

看看这个:/sf/answers/373686911/ -实体框架可能会假设你的CategoryID字段是一个标识,因此传递null到数据库期待它来填充它.

  • TL; DR - 如果它不是自动生成的,请将其添加到您的密钥:[DatabaseGenerated(DatabaseGeneratedOption.None)] (3认同)
  • 很好,但是我使用模型优先,但是在这个问题中,问题已经在代码优先的范围内解决了。 (2认同)
  • 是的 - EF假设它将在DB级别进行生成/递增,因此它将您的`Id` col作为"NULL"传递,即使其中有值.仅供参考,我认为这个答案对这个问题更有帮助:http://stackoverflow.com/a/5101369/1985648 (2认同)

D.B*_*d 32

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

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

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
Run Code Online (Sandbox Code Playgroud)

到这个"Id"字段,它曾经是SQL中的一个Identity列,但被更改为app-assigned.

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

  • 也为我工作:不需要重新生成类,只是将属性添加到属性并且它工作. (2认同)

小智 6

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

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int CategoryId { get; set; }
Run Code Online (Sandbox Code Playgroud)

或者将您的列 CategoryId 更改为身份:

    CategoryId int IDENTITY(1,1)
Run Code Online (Sandbox Code Playgroud)


Ada*_*Cox 5

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