【问题标题】:Entity Framework and super-type/sub-type实体框架和超类型/子类型
【发布时间】:2011-04-01 20:41:53
【问题描述】:

根据我最近收到的一个问题 (Database design problem) 的出色建议, 我在我的数据库中合并了一个超类型/子类型模式 为 MVC2 应用程序构建。 我将使用实体框架向 MVC 提供模型。

超类型是出版物,子类型是文章, 博客文章等 每个子类型表都有一个 2 列的复合主键(pub_id、 pub_type),外键引用对应的列 超类表

出于数据完整性目的(请参阅关于已接受解决方案的冗长 cmets 到原始问题)超类型表不应该包括 pub_type 在其主键中(与子类型表不同),

这就是实体框架似乎无法发挥作用的地方。从现有数据库生成 .edmx 文件时收到的警告:

关系“FK_Articles_Publications”的列不是 关系的主要方面的表的键的一部分。关系被排除在外。

(等等)

问题: 有没有办法诱使实体框架映射给定的关系 我想要的外键(或者我必须妥协数据库设计和 在超类型表上设置复合键)?

如果不是,这会增加额外的问题,即要求加入任何 其他,非子类型表(和我计划的几个)到超类型 表要求我有与 pub_id 和 pub_type。例如,我希望一个主题表能够关联 通过超类型表发布任何类型的出版物——我需要 将 pub_type (冗余)存储在主题表的列中。

我对 EF(和 ORM)还很陌生,但它的力量很诱人,我不想放弃它。

【问题讨论】:

    标签: entity-framework database-design


    【解决方案1】:

    在这张表中,

    CREATE TABLE publications (
      pub_id INTEGER NOT NULL PRIMARY KEY,
      pub_type CHAR(1) CHECK (pub_type IN ('A', 'B', 'P', 'S')),
      pub_url VARCHAR(64) NOT NULL UNIQUE,
      CONSTRAINT publications_superkey UNIQUE (pub_id, pub_type)
    );
    

    重要的是 {pub_id} 是唯一的,而 {pub_id, pub_type} 是唯一的。 (pub_type 列也应该声明为NOT NULL。)在第一种情况下,唯一性保证了身份。在第二种情况下,唯一性保证子类型引用超类型中正确类型的行。但是对于数据库引擎来说,哪个声明为PRIMARY KEY 哪个声明为UNIQUE 并不重要。两者都可以是外键引用的目标。

    如果 dbms 是围绕当前的关系理论设计的,它可能只支持 KEY 声明而不是 PRIMARY KEYNOT NULL UNIQUE

    因此,如果您的 ORM 无法以它们的编写方式处理约束,则可以将 {pub_id} 设为所有这些表中的主键,并声明可简化的超键 {pub_id, pub_type} 在所有这些表。

    我不知道这是否会让 EF 保持沉默。您应该测试引用子类型的表以及引用超类型的表。

    【讨论】:

    • 又来救我了!我对这个答案投了赞成票。我会设置那个设计,如果它与 EF 配合得很好,我会接受你的回答。
    • 好的,虽然我无法让 EF 接受最初规定的密钥(我将不得不在超类型中使用双 PK,并在非子类型的连接表中包含 pub_type )您在此处的回答清楚地表明,只要我正确定义约束,这不会损害关系完整性。再次感谢。
    【解决方案2】:

    试试Table Per Hierarchy继承,它看起来很适合你的设计。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      相关资源
      最近更新 更多