请帮助我,我是EF.Lazy的POCO对象的新加载似乎没有工作。
Data Acess层简单地包装对EF的对象上下文的调用。请参阅以下代码
public FilterMaster GetFilter(long ID)
{
FilterMaster entity = new FilterMaster();
try
{
using (var context = new RadarEntities())
{
//context.ContextOptions.LazyLoadingEnabled = false;
//context.ContextOptions.ProxyCreationEnabled = true;
entity = context.FilterMasters.SingleOrDefault(filter => filter.ID == ID);
//context.FilterMasters.Include(
context.LoadProperty(entity, "SQLQuery");
}
}
Q1:我是否在考虑延迟加载无法正常工作?
Q2:如果我想彻底加载所有相关的子对象,则必须为所有属性调用LoadProperty方法,或者有更简单的方法吗?
答案 0 :(得分:3)
您正在处理ObjectContext
。这是阻止您使用LazyLoading的原因。如果您需要LazyLoading,则包含GetFilter
的类应在创建时创建ObjectContext
,实施IDisposable
,并在处置时放置ObjectContext
。
答案 1 :(得分:2)
Q1:我是否在考虑延迟加载不起作用的事情?
它正在工作,但没有任何魔法 - 在代理下创建了一个代理,它会在第一次访问时尝试从数据库中检索属性值。
对于EF,数据库连接由上下文表示,您当前在使用块的末尾自动处理该上下文。没有数据库连接,EF不能懒惰地检索属性,因此延迟加载不会起作用。
在访问延迟加载所需的所有属性之前,您必须保持上下文的活动状态,或者急切地加载这些属性。
Q2:如果我想显式加载所有相关的子对象了 必须为所有属性或那里调用LoadProperty方法 是更简单的方法吗?
是的,您可以指定一个Include()
查询来急切地检索属性,在您的情况下将是:
entity = context.FilterMasters
.Include("SQLQuery")
.SingleOrDefault(filter => filter.ID == ID);