如何映射具有延迟加载属性的实体(不会导致它们加载)?

时间:2011-03-20 16:20:59

标签: c# entity-framework automapper ef-code-first entity-framework-4.1

我在MVC项目中使用EF 4.1和代码优先,而AutoMapper则将实体映射到视图模型。

在使用代码优先之前,我能够排除导航属性,以防止加载任何尚未加载的内容。我在我的查询中使用.Include()来包含我需要的引用,以避免额外的数据库往返。

但是,对于代码优先,我的实体只暴露实体属性(如果有多个,则为ICollection)。如何在不触发负载的情况下知道是否已加载?

假设可以这样做,有没有办法让它成为AutoMapper的默认行为,这样我就不必在每个实体上明确排除成员?

3 个答案:

答案 0 :(得分:11)

您可以通过以下方式检查entity的引用或集合导航属性是否已加载:

bool isLoaded1 = dbContext.Entry(entity).Reference(e => e.MyReferenceProperty)
                     .IsLoaded();
bool isLoaded2 = dbContext.Entry(entity).Collection(e => e.MyCollectionProperty)
                     .IsLoaded();

答案 1 :(得分:4)

EF Code First仅对标记为虚拟的属性进行延迟加载(它可以覆盖那些并放置DynamicProxy而不是它)。如果您未将属性设置为虚拟,则将关闭该属性的延迟加载。

答案 2 :(得分:2)

你应该可以通过关闭延迟加载来explicitly load

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
}