C# 在实体框架代码中首先忽略基类型是否也会忽略子类?

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

我试图模拟一个场景,在这个场景中,我从第三方库中的具体基类继承,然后首先使用实体框架代码映射我自己的类。我更希望我的类与基类具有相同的简单名称。显然,我不能更改基类的类名,也不能将基类更改为抽象类。正如预期的那样,我得到了以下错误:

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

据我所知,在EF6中,只要只映射了一个类,这是可能的。但是,如果尝试使用fluent API忽略基类,则会出现以下错误:

未映射类型“EfInheritanceTest.Models.Order”。检查一下 未使用Ignore方法显式排除该类型 或NotMappeAttribute数据批注。验证类型是否正确 定义为类,不是基元或泛型,并且不继承 来自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");
                                                    });

        }
    }
}

我认为如果子类与父类具有相同的名称,那么这将不起作用。在派生类的名称与父类的名称不同的情况下,我确实做到了这一点,但在名称相同的情况下,这似乎是不可能的,我以前不知道。为了测试它,我选择了一个继承使用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;。似乎对我有用。