【问题标题】:How to map a related table to an inherited entity (table-per-hierarchy)?如何将相关表映射到继承的实体(每个层次结构的表)?
【发布时间】:2010-09-26 22:32:11
【问题描述】:

我的数据库中有这些表。

alt text http://img166.imageshack.us/img166/3133/testdbschemafy5.png

有了实体框架,我想拥有类似的东西:

alt text http://img166.imageshack.us/img166/5721/testdbschemaefdv5.png

我使用了按层次结构继承的表,因此我为高级用户添加了一个新实体,并将其映射到具有条件的用户实体到 IsPremiumUser 属性。我想让 PremiumAccount 表关联到 PremiumUser 实体,但它不会像我那样工作:-/ 我收到此错误消息:

错误 3021:从第 113 行开始映射片段时出现问题:表 PremiumAccount 中的以下列中的每一列都映射到多个概念性侧属性: PremiumAccount.UserID 映射到

我的问题有什么解决办法吗?我可以将 PremiumAccount 实体与继承的实体相关联吗?还有其他方法吗?

【问题讨论】:

    标签: c# entity-framework ado.net


    【解决方案1】:

    我认为应该删除子类型的 PK 字段(因为它继承自其超类型)。

    也就是说,这不是一个好的继承候选者。仅当实体的类型无法更改时,才应执行实体继承。这更像是一个“角色”候选人,因此是真正的 1:1 关系。问题是用户可能会定期失去/获得高级角色,但您无法更改现有实体实例的类型(== 表行),即使看起来您可以通过简单地更改数据库。继承映射是关于严格的规则,你不能弯曲它们,因为实体中的继承是关于解释数据库中的数据,因为关系模型不知道继承的概念(尽管某些数据库通过允许 DDL SQL 中的继承来“作弊”像postgresql)

    【讨论】:

    • PremiumUser 实体不包含 PK,因为每个层次结构的继承。所有列都在超类型 User 实体中。我明白了,我的设计想法不太好,我必须考虑如何改变这一点。谢谢弗兰斯的回答:-)
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多