【问题标题】:Does ignoring a base type in Entity Framework Code First also ignore subclasses?在 Entity Framework Code First 中忽略基类型是否也会忽略子类?
【发布时间】:2014-07-17 23:01:09
【问题描述】:

我正在尝试模拟一个场景,在该场景中我从 3rd 方库中的具体基类继承,然后使用 Entity Framework Code First 映射我自己的类。我真的希望我的类与基类具有相同的简单名称。我显然无法更改基类的类名,也无法将基类更改为抽象。正如预期的那样,我收到以下错误:

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

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

未映射类型“EfInheritanceTest.Models.Order”。检查 没有使用 Ignore 方法明确排除该类型 或 NotMappedAttribute 数据注释。验证类型是 定义为一个类,不是原始的或泛型的,并且不继承 来自实体对象。

... 这似乎表明通过忽略基类,我也忽略了任何子类。完整代码如下。有什么办法可以解决这个问题并“忽略”子类?或者这是 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 项目时,我几乎总是有一个带有 int Id 属性的基本抽象类用作我的主键,所以我知道它可以完成。不过我不使用 fluent API。
  • 在我模拟的场景中,基类位于我无法更改的第 3 方库中。
  • 我刚刚抓住了我的一个旧项目并从我的班级中删除了抽象属性,它仍然有效。但是,如果我添加了模型构建器忽略代码,我得到了和你一样的错误。
  • 如果您要添加忽略,您可能不需要调用base.OnModelCreating(modelBuilder);。似乎对我有用。

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


【解决方案1】:

无论如何,这有点晚了:我能够通过非常简单的配置解决问题:

modelBuilder.Ignore<MyBaseClass>();

所以 EF 根本不关心 MyBaseClass,而是与 MyInheritedClass 一起工作,因为它不是。完美!

第二个错误与:

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

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

EF inheritance mapping 上也有一篇很棒的帖子。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-05-10
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多