忽略实体框架代码优先中的基类型是否也会忽略子类?

本文关键字:是否 类型 子类 基类 框架 实体 代码 | 更新日期: 2023-09-27 18:13:37

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

类型'EfInheritanceTest.Models. '顺序和类型"EfInheritanceTest.Models.Base。Order和Order都有一个简单的名字,因此不能在同一模型中使用。a中的所有类型给定的模型必须具有唯一的简单名称。使用"NotMappedAttribute"或在Code First流畅的API中调用Ignore来显式地排除a属性或类型。

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

类型'EfInheritanceTest.Models. '没有映射顺序。检查未使用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");
                                                    });
        }
    }
}

忽略实体框架代码优先中的基类型是否也会忽略子类?

不管怎么说都有点晚了:我已经用非常简单的配置解决了这个问题:

modelBuilder.Ignore<MyBaseClass>();

所以EF不关心MyBaseClass,但工作与MyInheritedClass,因为它不是。完美!

第二个错误与:

 modelBuilder.Types<Models.Base.Order>().Configure(c => c.Ignore());

,因为您从EF映射中排除了两个类(它从Models.Base.Order中排除了所有层次结构)。

还有一篇关于EF继承映射的优秀文章

如果子类与父类具有相同的名称,我认为这将不起作用。在派生类的名称与父类的名称不同的情况下,我肯定会这样做,但是当名称相同时(我以前不知道),这看起来不可能。为了测试它,我选择了我的一个项目,其中继承与EF一起工作,我更改了名称以适应您上面的命名方案,并且我得到了与您列出的相同的错误。看起来这可能是EF类型映射的一个限制。您是否能够将派生类的名称更改为与父类不同?