实体框架 4:为什么我无法获取派生实体的 ObjectSet 而不是 ObjectQuery?

发布于 2024-11-02 09:35:57 字数 362 浏览 1 评论 0原文

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

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

因此我宁愿有一个ObjectSet

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

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

干杯

I have an "Investment" entity that is derived from "BaseEntity".

With _container.BaseEntities.OfType<Investment>() I get an ObjectQuery that always queries the database.

Therefore I would rather have an ObjectSet<Investment>.

I can't understand why EF doesn't support this for derived entities... Or does it? ;)

If I would go ahead and create a "root entity" in EF (which would be silly) that has associations to all my derived entities, I would get EntityCollections for those entities through the navigation properties of that one root-entity. But there must be another way...

Cheers

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鱼窥荷 2024-11-09 09:35:57

这就是 EF ObjectContext API 中的工作原理。如果您尝试为派生实体创建ObjectSet,您将得到:

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

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

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

That is how it works in EF ObjectContext API. If you try to create ObjectSet for derived entity you will get:

ArgumentException: There are no
EntitySets defined for the specified
entity type 'Investment'. If
'Investment' is a derived type, use
the base type instead. Parameter name:
TEntity

Also once you define inheritance there are no navigation properties to derived entities. The association which offers navigation property is changed to inheritance.

I also followed your former questions which is probably source of this one and I have to say I tried a lot but I can never get your behavior. Even if I call Count directly to ObjectSet I always get SQL query (checked in the profiler) and count of entities in the database - not in the set.

我做我的改变 2024-11-09 09:35:57

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

ObjectQuery<T> does not always query the database. It is only a query specification - in this case a specification to return all BaseEntities of type Investment. You can compose it with additional filters or orderby clauses or projections and so on. Nothing is executed in the database until you apply some greedy operator like ToList() or First() etc. or until you apply a foreach loop to fetch the results.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文