此刻,当它失败时,我觉得有点武断。这是我的情况。
实体Foo:
class Foo {
int FooID {get;set;
User Creator {get;set;}
Bar TheBar {get;set;}
DateTime CreatedDateTime {get;set;}
}
实体用户:
class User {
int UserID {get;set;}
ObjectWhatchamacallit Foos {get;set;}
DateTime LastLogInDateTime {get;set;}
}
所以
return DB.ExecuteStoreQuery<Foo>("SELECT *,
Created AS CreatedDateTime,
LastLogIn AS LastLogInDateTime
FROM
[User]
JOIN Foo ON Foo.CreatorID = [User].UserID
JOIN Bar ON Foo.BarID = Bar.BarID",
"Foo");
将使用Bars而不是Creators加载Foos。
return DB.ExecuteStoreQuery<User>("SELECT *,
Created AS CreatedDateTime,
LastLogIn AS LastLogInDateTime
FROM
[User]
JOIN Foo ON Foo.CreatorID = [User].UserID",
"User");
表现不佳。用户已加载,但没有Foo。
这可能是因为
我一次又一次地遇到这个问题。我已经意识到别名(1)可能与它没有任何关系。用户是一个T-SQL关键字(2)可能是这个特定实例中的问题,但在我遇到此问题的所有时间中并不常见。所以对一般问题的回答是它是别的东西(3)。
一个问题是,某些关系名称可能已从edmx-designer最初建议的与存储键列名称对应的名称中更改。但对我而言,这种接缝在任何情况下都是随意的。
所以我再次提出标题中所述的一般问题,EF究竟是如何推断出查询返回的列子集实际上是相关实体的一部分?
答案 0 :(得分:2)
事实证明我被误导了。对ExecuteStoreQuery尊重关系需要什么的答案?是把自己打倒了,什么都不会。
这有时对我有用的唯一原因是我的业务层中隐藏了自动加载,如果我关注IntelliTrace,我会很容易发现这一事实。
直到昨天还没有希望,我被迫接受我的模型是为了复杂的EF,我准备平衡50000行T-SQL和一个充满显式负载的控制器之间的界限。
对于非常繁重的查询,我已经开始将查询分成几个,仍然使用ExecuteStoreQuery。所有相关结果都会自动加载到上下文中,并且关系设置得恰当。
EF June 2011 CTF的新版本可能证明就是我need。
我知道EFExtensions中提供了类似的功能。存储过程返回多个结果集。在撰写本文时,我不确定此查询需要多少次访问数据库,但我无法想象为什么需要多次访问。每个结果集最多一个,它仍然比显式加载更好。
让我们看看这是如何运作的。