Как можно заполнить модель, включая дочерние коллекции, из хранимой процедуры в EF Code First? - PullRequest
2 голосов
/ 18 августа 2011

Сначала у меня есть проект, использующий код Entity Framework.

По разным причинам один из запросов linq просто не работает, и я хочу заменить его вызовом хранимой процедуры.

Следующий код прекрасно работает для вызова хранимой процедуры и преобразования результата в список.

IEnumerable<Activity> activities =
    ((IObjectContextAdapter)MyContext)
       .ObjectContext.ExecuteStoreQuery<Activity>("GetActivities").ToList();

Однако я также хочу, чтобы некоторые включения в модели деятельности загружали одну из дочерних коллекций в этот объект. Например, у Activity есть коллекция Virtual List. Есть ли способ, которым я могу в своей хранимой процедуре также вернуть теги для каждого действия.

Если я сделаю следующее не работает

SELECT
   Activities.ID,
   Activities.Name,
   Tags.ID,
   Tags.Name
FROM
   Activities
   LEFT JOIN ActivityTags ON ActivityTags.ActivityID = Activities.ID
   LEFT JOIN Tags ON Tags.ID = ActivityTags.TagID

Это ошибка в C #, говорящая, что это не допустимое действие. Если я удаляю бит тегов из хранимой процедуры, чтобы он просто выбирал из таблицы «Действия», он работает нормально.

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

1 Ответ

2 голосов
/ 18 августа 2011

Это невозможно. Автоматическое заполнение сущности работает только для плоских объектов = вы можете заполнить Activity, но не его отношение. Вы должны использовать стандартный ADO.NET, если вы также хотите загрузить отношения, но в таком случае было бы лучше изменить хранимую процедуру, чтобы она возвращала отдельный набор результатов для каждой таблицы, чтобы уменьшить объем передаваемых данных.

...