【问题标题】:Force Entity Framework to recognise a TPT Inheritance Structure强制实体框架识别 TPT 继承结构
【发布时间】:2016-02-16 20:51:01
【问题描述】:

鉴于以下示例结构,Entity Framework 无法识别基本的Entity 继承,因此不会将其映射为用户和实体之间的 TPT 继承。

// Where DbSet<User> Users { get; set; } is used
public class User : User<int> { }

public class User<TTest> : Entity {
    public TTest Whatever { get; set; }
}

public abstract class Entity {
    public int EntityId { get; set; }
}

我相信这是因为 EF 只会查看第一级继承结构,而不会将 Entity 视为基类,只是它具有其属性。

所以我的问题是,如何强制 EF 识别 Entity 确实是基类?仅仅在迁移中定义 User 有一个 ForeignKey 到 Entity 显然是不够的,因为它仍然不会创建底层行。


奖励积分:我已经注意到我不能再降级(即Employee : User),但如果你想纠正我,我将永远欠你的债也。


更新:复制available here on github.com

更新 2:Gert Arnold 关于无法映射泛型类并因此破坏链的理论不幸地产生了相同的迁移,其中User 没有落入Entity

更新3:我可以确认,当用户正确映射时,上面删除的“奖励”确实有效。 Entity : User : Employee 的继承结构在所有 3 个都是表时工作,当用户甚至无法映射回实体时它显然不起作用,我现在认为这是 EF 中的一个错误。

【问题讨论】:

  • 问题是 EF 无法映射像 User&lt;TTest&gt; 这样的泛型类。
  • @GertArnold 我不想这样做,这就是为什么我有User
  • 是的,但是User&lt;TTest&gt;EntityUser之间,所以对于EF,如果你想将它映射为TPT,它会破坏继承链。
  • @GertArnold 公平点 - 让我试一试!
  • @GertArnold Nope - 即使UserBase 不是通用的,它仍然不会一直下​​降到Entity

标签: c# entity-framework inheritance table-per-type


【解决方案1】:

您需要为您希望 EntityFramework 为其添加表的每种类型添加一个 DbSet,如下所示:

public virtual DbSet<Entity> Entities { get; set; }
public virtual DbSet<User> Users { get; set; }

【讨论】:

  • 或者你也可以调用 modelBuilder.Entity();在 OnModelCreating 中让 EF 将实体拉入模型中。
  • 我不确定这是从哪里来的 - 实体表已创建并被其他人使用,对其他人来说效果很好。问题是没有为这个特定的表选择它。
  • 能否分享完整的代码清单(或项目)以便我们进行调试?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2016-04-09
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多