延迟加载不适用于Entity Framework中的POCO类

时间:2012-01-18 21:21:20

标签: c# entity-framework entity-framework-4

请帮助我,我是EF.Lazy的POCO对象的新加载似乎没有工作。

  • 我的POCO课程是一个sepearte程序集,而不是一个用于数据访问的程序集(即DAL)
  • 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");                   
    
            }
        }
    
    • 当DAL调用完成时,ObjectContext丢失,当我尝试获取Root POCO类的相关子对象时,我得到null。
    • 我已尝试显式启用ProxyCreation,EnabledLazyLoading,检查生成的代理clases是否未密封,所有相关属性都标记为虚拟(如某些其他链接所示)。 - 由于延迟加载不起作用,我想到了急切地加载所有相关的POCO对象,所以尝试调用LoadProperty方法,它起作用。

Q1:我是否在考虑延迟加载无法正常工作?

Q2:如果我想彻底加载所有相关的子对象,则必须为所有属性调用LoadProperty方法,或者有更简单的方法吗?

2 个答案:

答案 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);