EF代码优先:当IDENTITY_INSERT设置为OFF时,无法在表''中为identity列插入显式值

时间:2012-09-20 09:18:41

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

我首先遇到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");

    }
}

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

您无需更改映射代码,而应更改此行:

lngRequestLineID = 1001233

对此:

lngRequestLineID = 0

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

答案 2 :(得分:0)

我在向 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();
    }
}