C# 在实体框架代码中首先忽略基类型是否也会忽略子类?
我试图模拟一个场景,在这个场景中,我从第三方库中的具体基类继承,然后首先使用实体框架代码映射我自己的类。我更希望我的类与基类具有相同的简单名称。显然,我不能更改基类的类名,也不能将基类更改为抽象类。正如预期的那样,我得到了以下错误: “EfInheritanceTest.Models.Order”类型和 “EfInheritanceTest.Models.Base.Order”都有相同的简单名称 属于“订单”,因此不能在同一型号中使用。a中的所有类型 给定的模型必须具有唯一的简单名称。使用“NotMappedAttribute”或 在Code First fluent API中调用Ignore以显式排除 属性或模型中的类型 据我所知,在EF6中,只要只映射了一个类,这是可能的。但是,如果尝试使用fluent API忽略基类,则会出现以下错误: 未映射类型“EfInheritanceTest.Models.Order”。检查一下 未使用Ignore方法显式排除该类型 或NotMappeAttribute数据批注。验证类型是否正确 定义为类,不是基元或泛型,并且不继承 来自EntityObject 。。。这似乎表明,通过忽略基类,我也忽略了任何子类。完整代码如下。有没有办法解决这个问题并取消子类?或者这是EF类型映射的限制C# 在实体框架代码中首先忽略基类型是否也会忽略子类?,c#,entity-framework,inheritance,entity-framework-6.1,C#,Entity Framework,Inheritance,Entity Framework 6.1,我试图模拟一个场景,在这个场景中,我从第三方库中的具体基类继承,然后首先使用实体框架代码映射我自己的类。我更希望我的类与基类具有相同的简单名称。显然,我不能更改基类的类名,也不能将基类更改为抽象类。正如预期的那样,我得到了以下错误: “EfInheritanceTest.Models.Order”类型和 “EfInheritanceTest.Models.Base.Order”都有相同的简单名称 属于“订单”,因此不能在同一型号中使用。a中的所有类型 给定的模型必须具有唯一的简单名称。使用“No
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");
});
}
}
}
我认为如果子类与父类具有相同的名称,那么这将不起作用。在派生类的名称与父类的名称不同的情况下,我确实做到了这一点,但在名称相同的情况下,这似乎是不可能的,我以前不知道。为了测试它,我选择了一个继承使用EF的项目,我更改了名称以适应上面的命名方案,我得到了与您列出的相同的错误。看起来这可能是EF类型映射的一个限制。您是否可以将派生类的名称更改为与父类不同?无论如何,时间有点晚:我可以通过非常简单的配置来解决此问题:
modelBuilder.Ignore<MyBaseClass>();
所以EF根本不关心MyBaseClass,而是使用MyInheritedClass。太好了
第二个错误与:
modelBuilder.Types<Models.Base.Order>().Configure(c => c.Ignore());
当您从EF映射中排除这两个类时,它将从Models.Base.Order中排除所有层次结构
还有一篇很好的帖子。你能把基类抽象化吗?我应该补充一点,当我做一个EF项目时,我几乎总是有一个带有int-Id属性的基类作为主键,所以我知道这是可以做到的。但我不使用fluent API。在我模拟的场景中,基类位于第三方库中,我无法更改。我刚刚抓取了一个旧项目,并从类中删除了抽象属性,它仍然有效。但是,如果我添加了model builder ignore代码,则得到的错误与您相同。如果您添加ignore,则可能不需要调用base.OnModelCreatingmodelBuilder;。似乎对我有用。