忽略实体框架代码中的基类型也会忽略子类吗?

时间:2014-07-17 23:01:09

标签: c# entity-framework inheritance entity-framework-6.1

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

  

类型'EfInheritanceTest.Models.Order'和类型   'EfInheritanceTest.Models.Base.Order'都有相同的简单名称   'Order'等不能在同一型号中使用。所有类型的   给定模型必须具有唯一的简单名称。使用'NotMappedAttribute'或   在Code First Fluent API中调用Ignore以明确排除a   属性或类型来自模型。

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

  

未映射“EfInheritanceTest.Models.Order”类型。检查一下   尚未使用Ignore方法明确排除该类型   或NotMappedAttribute数据注释。验证类型是否   定义为类,不是原始的或通用的,并且不继承   来自EntityObject。

...这似乎表明通过忽略基类,我也忽略了任何子类。完整代码如下。有什么方法可以解决这个问题并且“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<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");
                                                    });

        }
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

反正有点晚了:我能够通过非常简单的配置解决问题:

modelBuilder.Ignore<MyBaseClass>();

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

第二个错误与:

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

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

EF inheritance mapping上还有一篇优秀的帖子。