【问题标题】:Entity Framework 4: Why can't I get an ObjectSet of derived entities rather than an ObjectQuery?实体框架 4:为什么我不能获得派生实体的 ObjectSet 而不是 ObjectQuery?
【发布时间】:2011-04-19 11:59:19
【问题描述】:

我有一个从“BaseEntity”派生的“投资”实体。

使用_container.BaseEntities.OfType<Investment>(),我得到一个始终查询数据库的 ObjectQuery。

因此我宁愿有一个ObjectSet<Investment>

我不明白为什么 EF 不支持派生实体的这一点......或者是吗? ;)

如果我继续在 EF 中创建一个“根实体”(这很愚蠢),它与我的所有派生实体都有关联,我将通过该根实体的导航属性获取这些实体的 EntityCollections。但肯定还有别的办法……

干杯

【问题讨论】:

    标签: entity-framework inheritance entity-framework-4


    【解决方案1】:

    这就是它在 EF ObjectContext API 中的工作方式。如果您尝试为派生实体创建ObjectSet,您将获得:

    ArgumentException: 没有 为指定的实体集定义 实体类型“投资”。如果 'Investment' 是派生类型,使用 而是基本类型。参数名称: 实体

    此外,一旦定义了继承,派生实体就没有导航属性。提供导航属性的关联改为继承。

    我也关注了你的former questions,这可能是这个问题的来源,我不得不说我尝试了很多,但我永远无法理解你的行为。即使我直接调用 Count 到 ObjectSet 我总是得到 SQL 查询(在分析器中检查)和数据库中的实体计数 - 而不是在集合中。

    【讨论】:

    • 嗨,如果我在“投资”上有一个导航属性“报告”,并且报告也派生自“BaseEntity”,则此导航属性返回一个 EntityCollection。这可以。关于缓存实体上的“Count()”,我可能混淆了 ObhectSet 和 EntityCollection。非常感谢您的帮助!
    【解决方案2】:

    ObjectQuery<T> 并不总是查询数据库。它只是一个查询规范——在本例中是返回所有Investment 类型的 BaseEntities 的规范。您可以使用其他过滤器或 orderby 子句或投影等来组合它。除非您应用诸如 ToList()First() 等的贪婪运算符,或者应用 foreach 循环来获取结果,否则不会在数据库中执行任何操作。

    【讨论】:

    • 我明白了!但是像您对非继承实体的简单 ObjectSet 可以让您添加对象并将它们保存在内存中。如果您使用 _container.BaseEntities.AddObject(investment) 添加“投资”并执行 _container.BaseEntities.OfType().ToList,则添加的“投资”不在该列表中,因为它没有保存到数据库呢。因此,如果我可以拥有 ObjectSet 会容易得多
    • @SolarX:对不起,我误解了你的问题的背景。 _container.BaseEntities.ToList() 会返回已添加但尚未保存的 Investment 实体吗?无论如何,您应该将这一点编辑到您的问题中,它使问题背后的原因更加清晰,也许有人知道解决方法。
    • 别担心 :) EF jut 今天让我有点紧张 ;) 非常感谢您的帮助!
    猜你喜欢
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多