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