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

时间:2012-01-13 18:02:32

标签: c# .net 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();
    }

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

以防万一:

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

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

9 个答案:

答案 0 :(得分:37)

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

答案 1 :(得分:26)

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

在这之后,我发现EF补充道:

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

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

我认为如果您没有该属性,EF将不会将ID实际发送到数据库('约定优于配置')

答案 2 :(得分:5)

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

答案 3 :(得分:2)

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

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

或将您的列CategoryId更改为标识:

    CategoryId int IDENTITY(1,1)

答案 4 :(得分:0)

今天遇到了同样的问题。

这是我找出问题的方式。

我最初将标识种子添加到该列中,但是之后我将其删除。 因此,我没有意识到,在首先修改代码中的列定义时,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);

答案 5 :(得分:0)

For me I had a different schema other than default one. The name of the Id key was some how missing the that schema part - fixed that in the database and it all went well. How it was ;

PK_TableName

How I changed it to

PK_mySchema.TableName

答案 6 :(得分:0)

İf模型首次尝试块

ID : 1, Data : [915, 565, 591, 254, 67]
ID : 2, Data : [915, 565, 591, 254, 67, 258, 57, 767, 866, 986, 558, 187, 976]

答案 7 :(得分:0)

0

如果您不先使用代码或先使用db,则oracle不要创建序列,而是尝试使用序列触发

     CREATE OR REPLACE TRIGGER 
"a"."IHALEYOL"
before insert on "a"."IHALEYOL"
for each row
begin
  select "a"."SQ_DIREK".nextval into :new."ID" from dual;
end;

序列:

 create sequence SQ_YETKI
minvalue 1
maxvalue 9999999999999999999999999999
start with 221
increment by 1
cache 20;

答案 8 :(得分:0)

我知道我来晚了,但是这是我设法解决的方法。

  1. 我在模型中将这些属性包括到我的int PK中。 (让我的种子在configuration.cs中) [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]

  2. 插入种子后,我在Visual Studio中使用SQL Server对象资源管理器,并通过右键单击表并按“视图设计器”转到该模型的表。 enter image description here

  3. 在下面,您将看到为创建该表而生成的脚本。在主键属性之后插入此命令。

    IDENTITY(1,1)

enter image description here

  1. 通过单击表格视图(左上角)上方的“更新”来应用脚本更改
    enter image description here

  2. 更新数据库后,返回模型并更改此属性:

    [DatabaseGenerated(DatabaseGeneratedOption.None)][DatabaseGenerated(DatabaseGeneratedOption.Identity)]

  3. 保存,添加迁移,然后更新数据库应执行此操作。

每次插入时,它现在都会增加,具体取决于您在IDENTITY脚本中指定的内容。