Я использую 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-запрос за кулисами.В идеале я хочу метод / подход, который загружает все Recommendation
И User
объекты только с одной поездкой в SQL.
Покажите мне деньги.
РЕДАКТИРОВАТЬ Мне не очень интересно обсуждать, хорошая это архитектура или плохая.Я упростил свой сценарий ради вопроса.Можете ли вы сделать то, что я спрашиваю, с EF API?
РЕДАКТИРОВАТЬ 2
Правка Ладислава давала надежду на новый подход, но этокажется, я не совсем там.
Я могу достичь того, что хочу, с помощью этого:
context.Sellers.Include("Recommendations.User").Single(s => s.Id == seller.Id);
Этот подход не работает с использованием LoadProperty
...
context.LoadProperty(seller, "Recommendations.User");
... поскольку происходит сбой с ошибкой ...
Указанное свойство навигации Recommended.User не найдено.
Ни один из этих подходовработать, если у вас нет ссылки на контекст.