Как мне сопоставить объекты с отложенными свойствами (не заставляя их загружаться)? - PullRequest
7 голосов
/ 20 марта 2011

Я использую EF 4.1 и code-first в проекте MVC и AutoMapper для отображения сущностей для просмотра моделей.

До использования code-first мне удалось исключить свойства навигации, чтобы предотвратить загрузку чего-либо, что еще не было загружено. Я использую .Include () в своих запросах, чтобы включить ссылки, которые мне нужны, чтобы избежать дополнительных обращений к базе данных.

Тем не менее, при использовании сначала кода моя сущность предоставляет только свойство сущности (или ICollection, если их несколько). Как я могу узнать, был ли он загружен без запуска загрузки?

Предполагая, что это можно сделать, есть ли способ сделать это поведением по умолчанию для AutoMapper, чтобы мне не приходилось явно исключать элементы в каждой отдельной сущности?

Ответы [ 3 ]

11 голосов
/ 20 марта 2011

Вы можете проверить, было ли загружено свойство ссылки или коллекции для entity:

bool isLoaded1 = dbContext.Entry(entity).Reference(e => e.MyReferenceProperty)
                     .IsLoaded();
bool isLoaded2 = dbContext.Entry(entity).Collection(e => e.MyCollectionProperty)
                     .IsLoaded();
4 голосов
/ 13 июня 2011

EF Code First выполняет отложенную загрузку только для свойств, помеченных как виртуальные (он может переопределять их и размещать вместо них DynamicProxy).Если вы не сделаете вашу собственность виртуальной, вы отключите отложенную загрузку этой собственности.

2 голосов
/ 20 марта 2011

Вы должны иметь возможность явно загружать их, отключив ленивую загрузку:

using(var context = new FooBarEntities())
{
  context.ContextOptions.LazyLoadingEnabled = false;
  Foo foo = context.Foo.Where(x => x.Id == myId).Single();
  ...
  if(!foo.Bars.IsLoaded)
  {
      foo.Bars.Load();
  }
  //do something with foo.Bars here
}
...