ExecuteStoreQuery需要什么来尊重关系?

时间:2011-05-11 12:24:30

标签: entity-framework entity-framework-4

此刻,当它失败时,我觉得有点武断。这是我的情况。

实体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. Foo和User中的别名?
  2. 用户是SQL关键字? (我已经尝试过aliasin [User] AS Creator,但无济于事)
  3. 其他什么?
  4. 更新

    我一次又一次地遇到这个问题。我已经意识到别名(1)可能与它没有任何关系。用户是一个T-SQL关键字(2)可能是这个特定实例中的问题,但在我遇到此问题的所有时间中并不常见。所以对一般问题的回答是它是别的东西(3)。

    一个问题是,某些关系名称可能已从edmx-designer最初建议的与存储键列名称对应的名称中更改。但对我而言,这种接缝在任何情况下都是随意的。

    所以我再次提出标题中所述的一般问题,EF究竟是如何推断出查询返回的列子集实际上是相关实体的一部分?

1 个答案:

答案 0 :(得分:2)

事实证明我被误导了。对ExecuteStoreQuery尊重关系需要什么的答案?是把自己打倒了,什么都不会。

这有时对我有用的唯一原因是我的业务层中隐藏了自动加载,如果我关注IntelliTrace,我会很容易发现这一事实。

直到昨天还没有希望,我被迫接受我的模型是为了复杂的EF,我准备平衡50000行T-SQL和一个充满显式负载的控制器之间的界限。

对于非常繁重的查询,我已经开始将查询分成几个,仍然使用ExecuteStoreQuery。所有相关结果都会自动加载到上下文中,并且关系设置得恰当。

EF June 2011 CTF的新版本可能证明就是我need

我知道EFExtensions中提供了类似的功能。存储过程返回多个结果集。在撰写本文时,我不确定此查询需要多少次访问数据库,但我无法想象为什么需要多次访问。每个结果集最多一个,它仍然比显式加载更好。

让我们看看这是如何运作的。