Стремительная загрузка навигационных свойств на подклассы сложна. Я не нашел другого способа, кроме как загрузить их отдельно. Самый простой способ сделать это - зарегистрировать пользовательский обработчик ObjectMaterialized (только в EF 4.0) в ObjectContext:
context.ObjectMaterialized += RegisterEagerLoadingStrategies;
И метод обработчика выглядит так:
private static void RegisterEagerLoadingStrategies(object sender, ObjectMaterializedEventArgs e)
{
var context = (ObjectContext)sender;
var cartItem = e.Entity as HotelCartItem;
if (cartItem != null)
{
context.LoadProperty(cartItem, o => o.Hotel);
}
}
Это решение имеет проблему N + 1. N + 1 означает, что если ваш основной запрос возвращает N HotelCartItems, вы будете выполнять N + 1 запросов в базе данных (каждый LoadProperty вызывает дополнительный запрос). Также этот метод вызывается для каждой загруженной сущности (не только для HotelCartItem). Так что это решение действительно плохо для загрузки большого количества объектов.
Еще один подход к загрузке свойств навигации из связанных объектов - это разделение вашего запроса на два запроса. Первый запрос загрузит CartItems, а второй запрос загрузит Hotels для элементов корзины, загруженных в первом запросе (те же условия). Ссылки на отели в корзине должны автоматически устанавливаться, если ваши объекты все еще привязаны к контексту.