EF4 Eager通过ObjectContext基础实例加载

时间:2011-04-19 21:08:51

标签: .net entity-framework-4

使用ORM时,我通常会创建一个工厂方法来返回我将用于查询数据源的DataContext / ObjectContext实例。我通常让我的工厂返回基础上下文类;所以在EF4的情况下,我返回一个ObjectContext类型实例,而不是生成的“MyDBConext”实例。方法签名看起来像这样:

ObjectContext CreateContext()

此CreateContext方法返回一个实例,其中包含LazyLoadingEnabled = false和ProxyCreationEnabled = false选项。当访问实体集合时,我会调用类似ctx.CreateObjectSet()的东西,其中T当然是实体类型。

我注意到当我使用ObjectContext类型实例而不是“MyDBConext”时,急切加载似乎不起作用。

User result = null;
using(ObjectContext ctx = ContextFactory.CreateContext()) {
              ObjectSet<User> userSet = ctx.CreateObjectSet<User>();
               //userSet.Include(x => x.Roles);
               userSet.Include("Roles");
               result = userSet.SingleOrDefault(exp);                
      }
      return result;

但是将using语句更改为

 using(MyDBConext ctx = new MyDBConext()) {

按预期工作。但为什么?我是否可以通过基础ObjectContext实例进行加载?

1 个答案:

答案 0 :(得分:0)

以下是我解决问题的方法

User result = null;
using(ObjectContext ctx = ContextFactory.CreateContext()) {
    ObjectSet<User> userSet = ctx.CreateObjectSet<User>();              
    result = userSet.Include("Roles").SingleOrDefault(exp);                
 }
 return result;

我认为include语句改变了ObjectSet / ObjectQuery的当前实例并将其返回。我认为这是最流畅的api是如何设计的。放置Include内联并链接方法调用会产生预期的查询结果。关于EF的流畅api,这是一个有趣的“事实”