我正在尝试模拟一个场景,在该场景中我从 3rd 方库中的具体基类继承,然后使用 Entity Framework Code First 映射我自己的类。我真的希望我的类与基类具有相同的简单名称。我显然无法更改基类的类名,也无法将基类更改为抽象。正如预期的那样,我收到以下错误:
“EfInheritanceTest.Models.Order”类型和“EfInheritanceTest.Models.Base.Order”类型都具有相同的简单名称“Order”,因此不能在同一模型中使用。给定模型中的所有类型都必须具有唯一的简单名称。在 Code First fluent API 中使用“NotMappedAttribute”或调用 Ignore 以从模型中显式排除属性或类型。
据我了解,在 EF6 中,只要实际映射了其中一个类,这是可能的。但是,如果我尝试使用 fluent API 忽略基类,则会收到以下错误:
未映射类型“EfInheritanceTest.Models.Order”。使用 Ignore 方法或 NotMappedAttribute 数据注释检查该类型是否被显式排除。验证该类型是否被定义为一个类,不是原始的或泛型的,并且不是从 EntityObject 继承的。
...这似乎表明通过忽略基类,我也忽略了任何子类。完整代码如下。有什么办法可以解决这个问题并“忽略”子类?或者这是 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<EfInheritanceTest.Models.Order> Orders { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Types<Models.Base.Order>().Configure(c => c.Ignore());
modelBuilder.Types<Models.Order>().Configure(c => c.ToTable("order"));
modelBuilder.Entity<Models.Order>().Map(c =>
{
c.MapInheritedProperties();
c.ToTable("order");
});
}
}
}