【问题标题】:Cannot insert the value NULL into column 'Id', column is identity and PK无法将值 NULL 插入到列“Id”中,列是标识和 PK
【发布时间】:2015-11-03 02:53:54
【问题描述】:

这个问题已经在 SO 上被问过很多次,但其他答案都没有帮助。我正在插入一个表(SQL Server 2014,EF 6),我收到错误Cannot insert the value NULL into column 'Id' ... column does not allow nulls. Id 列在我的数据库中设置为主键并且是一个标识列,我已经三重检查。我可以在不使用 SSMS 中的 T-SQL 指定 Id 的情况下插入,但 EF 失败。它传递了0 的值;我不明白为什么它不被接受。我不使用任何数据注释,我只使用流畅的映射。

This answerthis answer 都使用数据注释,不应用于此项目。这在没有注释的情况下可以正常工作;我不知道是什么改变导致了这个。

类:

namespace Nop.Core.Domain.Common
{
    public partial class GenericAttribute : BaseEntity
    {
        // Id is inherited from BaseEntity
        public virtual int EntityId { get; set; }
        public virtual string KeyGroup { get; set; }
        public virtual string Key { get; set; }
        public virtual string Value { get; set; }
    }
}

流利的地图:

namespace Nop.Data.Mapping.Common
{
    public partial class GenericAttributeMap : EntityTypeConfiguration<GenericAttribute>
    {
        public GenericAttributeMap()
        {
            ToTable("GenericAttribute");
            HasKey(ga => ga.Id);

            Property(ga => ga.KeyGroup).IsRequired().HasMaxLength(400);
            Property(ga => ga.Key).IsRequired().HasMaxLength(400);
            Property(ga => ga.Value).IsRequired();
        }
    }
}

要更新的代码:

prop = new GenericAttribute()
       {
           EntityId = entity.Id,
           Key = key,
           KeyGroup = keyGroup,
           Value = valueStr
       };
// calls _repository.Insert(), which then calls _context.SaveChanges();
InsertAttribute(prop);

Profiler 仅显示 SELECT,没有 INSERT 尝试:

{SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[EntityId] AS [EntityId], 
    [Extent1].[KeyGroup] AS [KeyGroup], 
    [Extent1].[Key] AS [Key], 
    [Extent1].[Value] AS [Value]
FROM [dbo].[GenericAttribute] AS [Extent1]}

【问题讨论】:

  • 我怀疑 EF 会通过 Id 本身,所以它根本不会询问 DBMS。使用 fluent API 和 Property(x=>x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);解决这个问题。
  • @DevilSuichiro 我刚试过,同样的错误。
  • 您可以使用分析器并验证正在生成的 SQL 吗?
  • @DrewJordan Profiler 不显示任何 INSERTs,仅显示 SELECTs。我已将其添加到帖子中。
  • @Vaindil 你可以试试 Database.Log 来捕获插入语句吗?

标签: c# sql-server entity-framework


【解决方案1】:

在我看来,您缺少 auto_increment 列上的设置。看看你桌子上这样的东西:

MySQL:

ALTER TABLE table_name MODIFY COLUMN coumn_name INT auto_increment

T-SQL:

ALTER TABLE table_name ADD column_name int NOT NULL IDENTITY (1,1) PRIMARY KEY

【讨论】:

  • AUTO_INCREMENTMS SQL Server 中?而是 IDENTITY 和 OP 说:" The Id column is set in my DB to be the primary key AND is an identity column, I've triple-checked that."
  • 那么也许你只需要指定增量部分。 ALTER TABLE MyTable ADD table_name int NOT NULL IDENTITY (1,1)
【解决方案2】:

尝试将以下内容添加到您的映射配置类中

Property(ga => ga.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

【讨论】:

    【解决方案3】:

    我对 FluentAPI 不是很熟悉,但我的直觉是这源于您的继承层次结构:也就是说,它看到的 NULL 值实际上是在您的 BaseEntity 上,而不是 GenericAttribute 本身。 This blog 建议您应该在父类上使用HasKey() 进行映射,而不是子类。这对数据库无关紧要,但 EF 可能正在尝试在父级上查找实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2023-03-04
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      相关资源
      最近更新 更多