使用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实例进行加载?
答案 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,这是一个有趣的“事实”