Что требуется для ExecuteStoreQuery, чтобы уважать отношения? - PullRequest
5 голосов
/ 11 мая 2011

В данный момент мне кажется, что это произойдет произвольно, когда это не удается. Вот мой случай.

Сущность 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;}
 }

So

 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");

прекрасно загрузит 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? (Я пробовал алиасин [Пользователь] AS Creator, но безрезультатно)
  3. чего-то еще?

Обновление

Я снова и снова сталкиваюсь с этой проблемой. Я понял, что aliasing (1), вероятно, не имеет к этому никакого отношения. Пользователь, являющийся ключевым словом T-SQL (2), может быть проблемой в данном конкретном случае, но не часто встречается во всех случаях, когда у меня была эта проблема. Так что ответ на общий вопрос - это что-то еще (3).

Одна из проблем заключается в том, что некоторые имена отношений могли быть изменены по сравнению с теми, которые изначально предлагал edmx-дизайнер, в соответствии с именами столбцов ключей хранилища. Но для меня это швы произвольно в любом случае.

Итак, я снова задаю общий вопрос, указанный в заголовке, как именно EF делает вывод, что подмножество столбцов, возвращаемых запросом, на самом деле является частью связанной сущности?

1 Ответ

2 голосов
/ 01 июля 2011

Оказывается, я ошибся.Ответ на вопрос «Что требуется для ExecuteStoreQuery, чтобы уважать отношения?»это просто сбить себя с толку. Ничего не выйдет.

Единственная причина, по которой это иногда работало для меня, заключалась в том, что у меня были скрытые автоматические загрузки на уровне бизнеса, и этот факт я бы легко обнаружил, если бы обратил внимание на IntelliTrace.

До вчерашнего дня не было никакой надежды, и я был вынужден признать, что моя модель была слишком сложной для EF, и я приготовился сбалансировать линию между 50000 строками T-SQL и контроллером, пронизанным явными нагрузками.

Для действительно тяжелых запросов я начал делить запрос на несколько, все еще используя ExecuteStoreQuery.Все связанные результаты автоматически загружаются в контекст, и отношения устанавливаются соответствующим образом.

Новая версия EF Июнь 2011 CTF может оказаться именно тем, что мне нужно .

Мне известно, что аналогичные функции были доступны в EFExtensions .Хранимые процедуры возвращают несколько наборов результатов.На момент написания статьи я не уверен, сколько поездок в базу данных требуется для этого запроса, но я не могу себе представить, почему потребуется более одного.Максимум по одному на набор результатов, который все же намного лучше, чем явная загрузка.

Давайте посмотрим, как это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...