【发布时间】: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<TTest>这样的泛型类。 -
@GertArnold 我不想这样做,这就是为什么我有
User。 -
是的,但是
User<TTest>在Entity和User之间,所以对于EF,如果你想将它映射为TPT,它会破坏继承链。 -
@GertArnold 公平点 - 让我试一试!
-
@GertArnold Nope - 即使
UserBase不是通用的,它仍然不会一直下降到Entity。
标签: c# entity-framework inheritance table-per-type