C# 为什么EF试图在id列中插入NULL?

C# 为什么EF试图在id列中插入NULL?,c#,.net,entity-framework,entity-framework-4,C#,.net,Entity Framework,Entity Framework 4,我正在使用EntityFramework4.0(模型优先)编写我的项目。在项目开始时,我遇到了这个问题:我试图在数据库中插入填充的对象,但我得到了一个例外: 无法将值NULL插入“CategoryId”列、表“ForumDB.dbo.Categories”中;列不允许空值。插入失败。声明已终止 代码: 我检查了这个物体,我确信它被填满了 以防万一: public Category(string name, string urlName, int index) { CategoryId =

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

无法将值NULL插入“CategoryId”列、表“ForumDB.dbo.Categories”中;列不允许空值。插入失败。声明已终止

代码:

我检查了这个物体,我确信它被填满了

以防万一:

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

发生了什么事?

看看这个:-实体框架可能假设您的CategoryId字段是一个标识,因此将null传递给数据库,希望它为您填充。

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

之后,我发现EF添加了:

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
此“Id”字段以前是SQL中的标识列,但已更改为应用程序分配


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

我创建了一个以int-ID作为PK的表,但是忘记了将“Identity Specification”设置为True

今天遇到了同样的问题

下面是我如何解决这个问题的

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

Property(x => x.Id)
    .HasColumnName("Id")
    .HasColumnType("int")
    .IsRequired();
所以实体框架发现它是一个标识列,我得到了上面的异常

为了解决这个问题,我添加了以下内容:

HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
最后一段是这样的:

Property(x => x.Id)
    .HasColumnName("Id")
    .HasColumnType("int")
    .IsRequired()
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

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

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int CategoryId { get; set; }
或者将列CategoryId更改为identity:

    CategoryId int IDENTITY(1,1)

对我来说,我有一个不同于默认模式的模式。Id键的名称是关于如何丢失模式部分的,修复了数据库中的该部分,一切都进行得很顺利。 情况如何

PK_TableName
我怎么把它改成了

PK_mySchema.TableName

İf型首试块

[Key]
 [DatabaseGenerated(DatabaseGeneratedOption.None)]
 public Int64 PolicyID { get; set; }
0

İ如果您不使用代码优先或db优先oracle不创建be sequnce,请尝试使用序列触发

     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;
序号:


我知道我有点晚了,但我是如何解决的

  • 我在我的模型中将这些属性包含到我的int PK中。(在configuration.cs中为我的种子让路)
    [Key]

    [数据库生成(DatabaseGeneratedOption.None)]

  • 插入种子后,我使用Visual Studio中的SQL Server对象资源管理器,右键单击该表并按“视图设计器”,转到该模型的表

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

    IDENTITY(1,1)

  • 通过单击表视图(左角)正上方的“更新”应用脚本更改

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

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

  • 保存、添加迁移,然后更新数据库


  • 每次插入时,它都会根据您在标识脚本上指定的内容递增。

    您的类别ID是什么数据类型?@Kyle,guid(uniqueidentifier)。它可能重复,但我先使用model,但在这个问题中,问题已在“代码优先”的范围内得到解决。@Kovpavalexey该问题中公认的答案是“代码优先”,但该问题中具体的链接答案是“模型优先”。@hvd,当我在DB-side上添加生成id时,这个问题就解决了。yep-EF假设它将在DB级别生成/增加,因此它将您的
    id
    列作为
    NULL
    传递,即使其中有值。仅供参考,我认为这个答案对这个问题更有帮助:TL;DR-如果密钥不是自动生成的,则将其添加到密钥中:[DatabaseGenerated(DatabaseGenerateOption.None)]对我也有效:不需要重新生成类,只需将属性添加到属性中就可以了。你让我开心了!
         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;