7

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

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

但是,在代码优先的情况下,我的实体仅公开一个实体属性(如果有多个,则为 ICollection)。在不触发加载的情况下如何知道是否已经加载?

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

4

3 回答 3

11

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

bool isLoaded1 = dbContext.Entry(entity).Reference(e => e.MyReferenceProperty)
                     .IsLoaded();
bool isLoaded2 = dbContext.Entry(entity).Collection(e => e.MyCollectionProperty)
                     .IsLoaded();
于 2011-03-20T16:43:26.833 回答
4

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

于 2011-06-13T18:57:04.137 回答
2

您应该能够通过关闭延迟加载来显式加载它们:

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
}
于 2011-03-20T16:42:05.897 回答