【问题标题】:EF code first: Cannot insert explicit value for identity column in table '' when IDENTITY_INSERT is set to OFFEF 代码优先:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“”中插入标识列的显式值
【发布时间】:2012-09-12 15:23:29
【问题描述】:

我首先遇到了 EF 代码问题

当我尝试将新记录插入表中时,我会收到消息。

Cannot insert explicit value for identity column in table '' when IDENTITY_INSERT is set to OFF.

知道为什么会出现错误吗?

我正在使用以下代码:

 public void SaveNewResponse()
    {
        using (var context = new Context())
        {
            var newResponse = new Response()
                {
                    lngRequestLineID = 1001233,
                    memXMLResponse = "test Response",
                    fAdhoc = false,
                };
            context.tblResponses.Add(newResponse);
            context.SaveChanges();
        }
    }

这是我的地图

 public class tblResponsMap : EntityTypeConfiguration<tblRespons>
{
    public tblResponsMap()
    {
        // Primary Key
        this.HasKey(t => new { t.lngResponseLineID});

        // Properties
        this.Property(t => t.lngResponseLineID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        this.Property(t => t.lngRequestLineID);

                 // Table & Column Mappings
        this.ToTable("tblResponses");
        this.Property(t => t.lngResponseLineID).HasColumnName("lngResponseLineID");
        this.Property(t => t.lngRequestLineID).HasColumnName("lngRequestLineID");
        this.Property(t => t.fAdhoc).HasColumnName("fAdhoc");
        this.Property(t => t.memXMLResponse).HasColumnName("memXMLResponse");

    }
}

【问题讨论】:

  • 一如既往,我发布问题并在几分钟后找到答案..

标签: ef-code-first sql-server-2000


【解决方案1】:

好的, 我找到了。 数据库已正确设置,但我的映射不正确。

public class tblResponsMap : EntityTypeConfiguration<tblRespons>
{
public tblResponsMap()
{
    // Primary Key
    this.HasKey(t => new { t.lngResponseLineID});

    // Properties
    this.Property(t => t.lngResponseLineID)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); <-- here

    this.Property(t => t.lngRequestLineID);

    // Table & Column Mappings
    this.ToTable("tblResponses");
    this.Property(t => t.lngResponseLineID).HasColumnName("lngResponseLineID");
    this.Property(t => t.lngRequestLineID).HasColumnName("lngRequestLineID");
    this.Property(t => t.fAdhoc).HasColumnName("fAdhoc");
    this.Property(t => t.memXMLResponse).HasColumnName("memXMLResponse");
}
}

【讨论】:

  • 当您从 EF 4 升级到 5 时遇到此错误时,此解决方案有效。
【解决方案2】:

您不需要更改映射代码,而是应该更改此行:

lngRequestLineID = 1001233

到这里:

lngRequestLineID = 0

在我的过期时间里,用 [KeyAttribute] 装饰 de Id 实体的属性就足够了。

【讨论】:

    【解决方案3】:

    我在向 EF 核心实体模型添加关系时遇到此错误,方法是将其指向在当前上下文之外获取且不再被跟踪的实体模型。我这样做是为了避免额外的读取操作,这最初让我觉得很尴尬。

    public static void AddMatches(List<Match> matches, Profile p)
    {
        using (var db = new DbContext())
        {
            foreach (var match in matches)
            {
                match.Profile = p;
                db.Match.Add(match);
            }
            db.SaveChanges();
        }
    }
    

    我通过另一个读取操作解决了这个问题。在咨询了 Microsoft 文档Here 之后,我确信这是相对正常的,尤其是在 MVC 世界中。修复:

    public static void AddMatches(List<Match> matches, Profile p)
    {
        using (var db = new DbContext())
        {
            var profile = db.Profile.Find(p.ProfileId);
            foreach (var match in matches)
            {
                match.Profile = profile;
                db.Match.Add(match);
            }
            db.SaveChanges();
        }
    }
    

    【讨论】:

      【解决方案4】:

      EF 核心 5, 在我的情况下,将“Id”属性显式设置为默认值解决了这个问题:

      public class PurchaseOrder
          {
      
              public int Id { get; set; }
              public string FileName { get; set; }
              public string FilePath { get; set; }
              ...
          }
      

      如果您遵循命名约定,默认情况下,Id 列是标识 ('Id' 作为列名),否则使用如下

      protected override void OnModelCreating(ModelBuilder builder)
          {
              base.OnModelCreating(builder);
              ...
      
              builder.Entity<BranchLocationBin>(entity =>
                  {
                      entity.Property(e => e.BId).UseIdentityColumn();
                  });
          }
      

      现在在创建实例时,将 Id 列显式设置为默认值 (在 int 的情况下为 0):

                  var model = new PurchaseOrder {
                      Id = 0  <---- Like this
                      ...
                  };
                              
                 await dbContext.PurchaseOrders.AddAsync(model);
                 await dbContext.SaveChangesAsync();
      

      【讨论】:

        猜你喜欢
        • 2012-09-30
        • 1970-01-01
        • 2012-11-10
        • 1970-01-01
        • 2016-01-20
        • 2016-05-13
        • 2016-08-18
        相关资源
        最近更新 更多