Entity Framework - жадная загрузка связанных сущностей

Я использую Entity Framework 4 с MVC и мне нужно убедиться, что все ссылочные сущности, которые я хочу использовать в моем представлении, были загружены до того, как метод контроллера вернется, иначе представление выдаст ужасное:

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

При выборе прямо из контекста я могу просто использовать метод Include (string) , чтобы принудительно включить их в сгенерированный запрос SQL:

var sellers = context.Sellers.Include("Recommendations.User").ToList();

Однако, если у меня есть (например) вспомогательный метод, который принимает объект и требует загрузки всех элементов, метод Include недоступен.

void Test(Seller seller)
{
    // ensure all recommendations and their users are loaded
}

Подход грубой силы заключается в их обходе:

foreach (var recommendation in seller.Recommendations)
    recommendation.User.ToString(); // just force a load

Если у меня есть 100 рекомендаций, это создаст 101 SQL-запрос «за кадром». В идеале мне нужен метод / подход, который загружает все объекты Рекомендации И Пользователь только за одну поездку в SQL.

Покажи мне деньги.

РЕДАКТИРОВАТЬ Мне не очень интересно обсуждать, хорошая это архитектура или плохая. Я упростил свой сценарий ради вопроса. Можете ли вы сделать то, о чем я прошу, с EF API?

РЕДАКТИРОВАТЬ 2

Правка Ладислава давала надежду на новый подход, но, похоже, я не совсем там.

Я могу добиться того, чего хочу, с помощью этого:

context.Sellers.Include("Recommendations.User").Single(s => s.Id == seller.Id);

Этот подход не работает с использованием LoadProperty ...

context.LoadProperty(seller, "Recommendations.User");

... поскольку он не работает с ошибкой ...

Указанное свойство навигации «Рекомендации. Пользователь» не найдено.

Ни один из этих подходов не работает, если у вас нет ссылки на контекст.

12
задан Community 23 May 2017 в 12:17
поделиться