【问题标题】:Entity framework data context does not contain a collection of my entity that uses inheritance. Why?实体框架数据上下文不包含我使用继承的实体的集合。为什么?
【发布时间】:2011-06-14 04:40:24
【问题描述】:

我正在使用具有实体框架的模型,该模型利用了继承的优势。我有一个名为“User”的基本类型的实体和两个从它继承的实体(“Admin”和“Worker”)。这是模型:


(来源:codetunnel.com

问题是,当我创建我的实体框架容器时,它上面没有工作人员或管理员的集合,只有用户。

EntityContainer context = new EntityContainer();
context.Users; // Exists.
context.Workers; // does not exist.

如何获取工作人员/管理员的集合而不仅仅是普通用户? 同样,我怎样才能给我的FamilyAccount 实体一个用于管理员和工作人员的导航属性,而不是普通用户?

提前致谢!

PS - 如果这很重要,我正在使用table-per-type 模型进行继承。

.OfType 似乎运作良好。是否有其他方法可以为工作人员或管理员实际添加导航属性?

【问题讨论】:

    标签: c# entity-framework inheritance entity-framework-4 model


    【解决方案1】:

    是的,这是 EF 的行为。 如果要导航到 Admin 和 Worker,可以执行以下操作:

    var admins = context.Users.OfType<Admin>();
    var workers = context.Users.OfType<Worker>();
    

    【讨论】:

      【解决方案2】:

      http://mosesofegypt.net/post/Inheritance-and-Associations-with-Entity-Framework-Part-3.aspx

      本文介绍了如何扩展实体并自己添加导航属性。滚动到“构建特定部门查询”标题。这就是我所追求的,消除了使用.OfType&lt;Worker&gt;()的要求。

      现在我可以做familyAccount.Admins 并且附近一切都很好。

      【讨论】:

      • 我不是在批评,但是当您在模型上单击更新时会发生什么?您的手动关联会消失还是保留?
      【解决方案3】:

      Table-per-Type (TPT) 继承涉及将基类型的所有属性存储在单个表中。 Table-per-Concrete Type (TPC) 继承涉及将每种类型的数据存储在一个完全独立的表中,它们之间没有外键约束。

      如果您希望 Admins 和 Workers 使用单独的表,那么您可能应该使用 TPC。

      【讨论】:

      • 不,TPT 涉及将所有类型存储在单独的表中。将所有内容存储在一张表中称为Table-Per-Heirarchy。我正在使用 TPT,它们已经是单独的表。用户、管理员和工作人员有自己的表。 TPC 是一个极端情况,与我的需求完全不同。
      • 不,TPT 将所有公共数据成员存储在一个表中。然后,所有唯一数据成员都进入其相应的类表中。 TPH 将所有数据成员放在一个表中,并使用鉴别器来查看它是哪个子类。
      • 对,就是我刚才说的。 TPC 不是我在这里需要的,因为它在有重叠字段时使用,我没有。我已经为你提供了描述每篇文章的链接,如果你有一些否定我提供的信息的信息,请给我链接。
      • 所以您希望表结构保持不变,但希望能够直接从上下文访问子类列表?
      • 表结构没问题。基类有一个表,继承类有自己的表。我只是想要一种将导航属性附加到特定类型的所有用户的方法。其中,我在与您链接的一篇文章中找到了一篇,并将其作为答案发布。
      猜你喜欢
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 2010-10-07
      • 1970-01-01
      相关资源
      最近更新 更多