【问题标题】:Entity Framework 4 - Inheritance实体框架 4 - 继承
【发布时间】:2011-05-08 01:25:12
【问题描述】:

我正在尝试了解 EF4 中的继承映射。

我的数据库有两个表,结构如下:

PersonCategory 表:

  • CategoryID (int) (identity) (PK)
  • CategoryType (nvarchar(50))

人员表

  • PersonID (int) (身份) (PK)
  • CategoryID(来自 PersonCategory 表的 FK)
  • 名称 (nvarchar(50))
  • 说明(nvarchar(max))

PersonCategory 表有四个条目,每个条目代表一个类别 - Student、CourseInstructor、Staff 和 A​​dvisor。

通过在线阅读articles,我认为Table Per Hierarchy 将是适合这种情况的模型。所以在 EF4 中,我创建了四个实体(Student、CourseInstructor、Staff 和 A​​dvisor),每个实体都继承自 Person 表。然后,我将它们中的每一个映射到 Person 表,并为每个添加一个条件(例如,对于 Student 实体,CategoryID = 1,对于 Staff 实体,CategoryID = 2)以区别于其他实体。我还从 Person 表中删除了 CategoryID 属性并将其设为抽象类。但我收到以下错误,因为我从 Person 表中删除了 CategoryId 属性。

错误 3015:从第 101、108、114、120、126、133 行开始映射片段时出现问题:从表 Person (CategoryID) 到表 PersonCategory (CategoryID) 的外键约束“FK_Person_PersonCategory”:: 映射不足:外键必须映射到一些在概念方面参与外键关联的 AssociationSet 或 EntitySet。

Table Per Hierarchy 是否适合这种情况?如果不是,那么我应该如何在 EF4 中处理这种情况?

【问题讨论】:

    标签: .net inheritance entity-framework-4 hierarchy table-per-hierarchy


    【解决方案1】:

    在关联中使用鉴别器列是有问题的。见:-

    http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/24380ee6-4753-46a2-a3ed-b1cb2e2d161c

    “关键点是作为鉴别器的列不能映射到关联,除非它参与非空条件。”

    【讨论】:

    • 感谢您的指点。我理解所解释的要点。我是否将其解释为 EF4 无法处理这种情况?因为在我的应用程序的实体模型中,我希望两个表都存在关联。我将如何处理这种情况?
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      对于 Table-per-Hierarchy,单个表包含所有类型的所有列。你有两张桌子,所以我立即怀疑。

      如果选择 Table-per-Type,那么它也不对。您只能有两种类型,基类和派生类,而 PersonCategory 表为派生类型的属性值提供数据。但是,这需要将 PersonID 作为外键,而它没有。

      就个人而言,我认为您不必要地将实体分成不同的类型。您可以将两个表中的所有列映射到一个实体,或者如果可能,更改数据库架构以更好地满足您的需求。

      我建议使用空的测试数据库并进行 TPT 和 TPH 模型优先设计,并查看 EF 为您所需的设置构建的架构。

      卢克

      【讨论】:

        猜你喜欢
        • 2011-05-06
        • 2011-05-19
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多