【问题标题】:Why is EF trying to insert NULL in id-column?为什么 EF 试图在 id-column 中插入 NULL?
【发布时间】:2012-01-13 18:02:32
【问题描述】:

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

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

代码:

    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;
}

发生了什么事?

【问题讨论】:

标签: c# .net entity-framework entity-framework-4


【解决方案1】:

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

【讨论】:

  • 不错,不过我用的是model-first,不过在这个问题中问题已经在code-first的范围内解决了。
  • @KovpaevAlexey 该问题中接受的答案是代码优先,但该问题中的具体链接答案是模型优先。
  • @hvd,当我在DB端添加生成id时,这个问题已经解决了。
  • 是的 - EF 假设它将在 DB 级别生成/递增,因此它通过您的 Id col 作为 NULL,即使其中有一个值。仅供参考,我认为这个答案对这个问题更有帮助:stackoverflow.com/a/5101369/1985648
  • TL;DR - 如果它不是自动生成的,请将其添加到您的密钥中:[DatabaseGenerated(DatabaseGeneratedOption.None)]
【解决方案2】:

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

做完之后发现EF加了:

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

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

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

【讨论】:

  • 也为我工作:不需要重新生成类,只需将属性添加到属性中就可以了。
【解决方案3】:

我创建了带有 int Id 作为 PK 的表,但忘记设置“身份规范”= True

【讨论】:

  • 你成就了我的一天!
【解决方案4】:

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

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

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

    CategoryId int IDENTITY(1,1)

【讨论】:

    【解决方案5】:

    对我来说,我有一个不同于默认模式的模式。 Id 键的名称有点缺少该模式部分 - 在数据库中修复了它,一切顺利。 怎么样;

    PK_TableName
    

    我是怎么改成的

    PK_mySchema.TableName
    

    【讨论】:

      【解决方案6】:

      İf 模型第一次尝试块

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

      【讨论】:

        【解决方案7】:

        0

        İ如果您不首先使用代码或首先使用数据库 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】:

          今天遇到了同样的问题。

          这是我发现问题的方法。

          我最初已将身份种子添加到列中,但之后我将其删除。 所以我没有意识到,首先修改Code中的列定义时,Id

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

          所以实体框架发现它是一个身份列,我得到了上面的异常。

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

          HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
          

          所以最后一段是这样的:

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

          【讨论】:

            【解决方案9】:

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

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

            2. 插入种子后,我使用 Visual Studio 中的 SQL Server 对象资源管理器并通过右键单击该表并按“查看设计器”进入此模型的表

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

              IDENTITY(1,1)

            1. 通过点击表格视图上方的“更新”(左角)应用脚本更改

            2. 更新数据库后,回到你的模型并改变这个属性:

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

            3. 保存,添加迁移然后更新数据库应该这样做。

            现在每次插入时,它都会根据您在 IDENTITY 脚本中指定的内容递增。

            【讨论】:

              猜你喜欢
              • 2017-06-10
              • 1970-01-01
              • 1970-01-01
              • 2023-03-04
              • 2017-01-20
              • 1970-01-01
              • 2020-05-06
              • 1970-01-01
              • 2012-10-17
              相关资源
              最近更新 更多