Identitt_insert 设置为 OFF 时无法插入标识值

Cannot insert value for identity when Identitt_insert is set to OFF

我知道我不是第一个在这里问这个问题的人。但是在经历了很多关于这个的答案之后,我仍然无法解决我的问题。

原来如此。

我的 Code First 模型中有多个派生模型,共享相同的标识 属性。

这是我的模型示例

public class Foo 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int FooId { get; set; }

    public string SomeProperty{get;set;}
}

public class DerivedFoo : Foo
{
    public string SomeOtherProperty {get;set;}
}

public class EvenMordeDerivedFoo : DerivedFoo 
{
    public string AndAnotherProperty {get;set;}
}

所以根据我的理解,我的 FooContext 重写应该如下所示:

public class FooContext : DbContext
{
   public DbSet<Foo> Foos{get;set;}
   public DbSet<DerivedFoo> DerivedFoos{get;set;}
   public DbSet<EvenMordeDerivedFoo > EvenMordeDerivedFoos{get;set;}

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
   {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<DerivedFoo>().ToTable("DerivedFoo");
        modelBuilder.Entity<EvenMordeDerivedFoo >().ToTable("EvenMordeDerivedFoo ");
    }
}    

有了这个,我可以毫无问题地使用 Foo 创建 运行 context.SaveChanges() 。但是当我尝试通过以下方式创建 DerivedFoo 时:

var derivedFoo= _context.DerivedFoos.Create();
_context.DerivedFoos.Add(derivedFoo);
_context.SaveChanges();

我遇到了臭名昭著的错误:

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

根据我的理解,Entity Framework 试图解释如果我将 Identity_Insert 设置为 true,我不应该自己修改属性 FooId。

我同意 EF 的观点,因为我希望每次创建新的 Foo、DerivedFoo 或 EvenMordeDerivedFoo 时都设置这个 FooId 属性,这解释了我添加行

的原因
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

所以如果有人能解释我做错了什么可以解释,那就太好了。

编辑:我仍然找不到答案,经过验证,我的模型大部分匹配this tutorial模型。所以我很确定答案很简单,但我没能找到我错过的东西

I should add some ID properties in DerivedFoo and EvenMoreDerivedFoo

没有。实体很好。派生类型的表不能有 IDENTITY 属性.

EG,这将创建只有 Foo 的 ID 列具有 IDENTITY 属性:

的表
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using System.Linq;

namespace Ef6Test
{

    public class Foo
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int FooId { get; set; }

        public string SomeProperty { get; set; }
    }

    public class DerivedFoo : Foo
    {
        public string SomeOtherProperty { get; set; }
    }

    public class EvenMordeDerivedFoo : DerivedFoo
    {
        public string AndAnotherProperty { get; set; }
    }
    class Db : DbContext
    {
        public DbSet<Foo> Foos { get; set; }
        public DbSet<DerivedFoo> DerivedFoos { get; set; }
        public DbSet<EvenMordeDerivedFoo> EvenMordeDerivedFoos { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<DerivedFoo>().ToTable("DerivedFoo");
            modelBuilder.Entity<EvenMordeDerivedFoo>().ToTable("EvenMordeDerivedFoo ");
        }
    }




    class Program
    {
        static void Main(string[] args)
        {

            Database.SetInitializer(new DropCreateDatabaseAlways<Db>());

            using (var db = new Db())
            {

                db.Database.Log = m => Console.WriteLine(m);
                db.Database.Initialize(true);

                var derivedFoo = db.DerivedFoos.Create();
                db.DerivedFoos.Add(derivedFoo);
                db.SaveChanges();

            }

            Console.WriteLine("Hit any key to exit");
            Console.ReadKey();
        }
    }
}