Я использую 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");
... поскольку он не работает с ошибкой ...
Указанное свойство навигации «Рекомендации. Пользователь» не найдено.
Ни один из этих подходов не работает, если у вас нет ссылки на контекст.