忽略entity framework代码中的基类型也会忽略子类吗?

我正在尝试模拟一个场景,在这个场景中,我从第三方库中的具体基类inheritance,然后使用Entity Framework Code First映射我自己的类。 我更希望我的类具有与基类相同的简单名称。 我显然不能更改基类的类名,也不能将基类更改为抽象。 正如所料,我收到以下错误:

类型’EfInheritanceTest.Models.Order’和类型’EfInheritanceTest.Models.Base.Order’都具有相同的简单名称’Order’,因此不能在同一模型中使用。 给定模型中的所有类型都必须具有唯一的简单名称。 使用“NotMappedAttribute”或在Code First Fluent API中调用Ignore,以从模型中明确排除属性或类型。

据我所知,在EF6中,只要实际映射了其中一个类,就可以实现。 但是,如果我尝试使用流畅的API忽略基类,我会收到以下错误:

未映射“EfInheritanceTest.Models.Order”类型。 使用Ignore方法或NotMappedAttribute数据批注检查未明确排除类型。 validation类型是否已定义为类,不是原始类型还是通用类型,并且不从EntityObjectinheritance。

…这似乎表明通过忽略基类,我也忽略了任何子类。 完整代码如下。 有什么方法可以解决这个问题并且“unignore”这个子类? 或者这是EF类型映射的限制?

namespace EfInheritanceTest.Models.Base { public class Order { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual decimal Amount { get; set; } } } namespace EfInheritanceTest.Models { public class Order : Base.Order { public virtual DateTime OrderDate { get; set; } } } namespace EfInheritanceTest.Data { public class OrdersDbContext : DbContext { public OrdersDbContext() : base ("OrdersDbContext") { } public IDbSet Orders { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Types().Configure(c => c.Ignore()); modelBuilder.Types().Configure(c => c.ToTable("order")); modelBuilder.Entity().Map(c => { c.MapInheritedProperties(); c.ToTable("order"); }); } } } 

如果子类与父类具有相同的名称,我认为这不会起作用。 我肯定已经完成了这个,派生类的名称与父类不同,但是当名称相同(我之前不知道)时,我看起来不可能。 为了测试它,我参加了我的一个项目,其中inheritance与EF一起使用,我更改了名称以适应您上面的命名方案,并且我得到了您列出的相同错误。 看起来这可能是EF类型映射的限制。 您是否可以将派生类的名称更改为与父项不同?

无论如何,这有点晚了:我能够通过非常简单的配置解决问题:

 modelBuilder.Ignore(); 

所以EF根本不关心MyBaseClass,但是可以使用MyInheritedClass,因为它不是。 完善!

第二个错误与:

  modelBuilder.Types().Configure(c => c.Ignore()); 

当你从EF映射中排除这两个类时(它排除了Models.Base.Order中的所有层次结构)。

关于EFinheritance映射还有一篇很好的文章。