【发布时间】:2017-12-04 13:10:44
【问题描述】:
我知道我不是第一个在这里提出这个问题的人。但是在经历了很多关于这个的答案之后,我仍然无法解决我的问题。
原来如此。
我的 Code First 模型中有多个派生模型,共享相同的 Idenity 属性。
这是我的模型示例
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();
我最终遇到了臭名昭著的错误:
"无法为表中的标识列插入显式值 IDENTITY_INSERT 设置为 OFF 时的 'DerivedFoo'。"
据我了解,Entity Framework 试图解释如果我将 Identity_Insert 设置为 true,我不应该自己修改 FooId 属性。
我同意 EF 的观点,因为我希望每次创建新的 Foo、DerivedFoo 或 EvenMordeDerivedFoo 时都设置这个 FooId 属性,这解释了我添加该行的原因
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
所以如果有人能解释我做错了什么可以解释,那就太好了。
编辑:我仍然找不到答案,经过验证,我的模型大多匹配this tutorial模型。所以我很确定答案很简单,但我找不到我错过的东西
【问题讨论】:
-
是从上述模型迁移生成的数据库模式(我看到的 TPT)。如果是,
DerivedFoo、EvenMordeDerivedFoo等中的FooId列应该不是身份。 -
是的,数据库是从模型中生成的。因此,如果我理解正确,我应该在 DerivedFoo 和 EvenMoreDerivedFoo 中添加一些 ID 属性?
标签: entity-framework inheritance identity