我在MVC项目中使用EF 4.1和代码优先,而AutoMapper则将实体映射到视图模型。
在使用代码优先之前,我能够排除导航属性,以防止加载任何尚未加载的内容。我在我的查询中使用.Include()来包含我需要的引用,以避免额外的数据库往返。
但是,对于代码优先,我的实体只暴露实体属性(如果有多个,则为ICollection)。如何在不触发负载的情况下知道是否已加载?
假设可以这样做,有没有办法让它成为AutoMapper的默认行为,这样我就不必在每个实体上明确排除成员?
答案 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
}