实体框架、Linq、ObjectContext和延迟执行问题?
我是Linq to EntityFramework的新手,Linq2EntityFramework中的一个问题是何时或是否处理ObjectContext。我问这个问题的原因是,通常在我的DAL中,我有如下代码实体框架、Linq、ObjectContext和延迟执行问题?,linq,entity-framework,Linq,Entity Framework,我是Linq to EntityFramework的新手,Linq2EntityFramework中的一个问题是何时或是否处理ObjectContext。我问这个问题的原因是,通常在我的DAL中,我有如下代码 public List<User> GetUsers() { using (MyEntities db = new MyEntities()) //where MyEntities inherits ObjectContext. { //
public List<User> GetUsers()
{
using (MyEntities db = new MyEntities()) //where MyEntities inherits ObjectContext.
{
// do some linq select operation which returns IQueryable<User>
// call ToList() on the return IQueryable which is when the DB is really accessed
// then we return List<User>
}
// after using statement a Dispose method on ObjectContext is called, hence disposed the ObjectContext, and in turn it closes my DB connection and releases it to the pool
}
公共列表GetUsers()
{
使用(MyEntities db=new MyEntities())//其中MyEntities继承ObjectContext。
{
//执行一些返回IQueryable的linq select操作
//在返回IQueryable时调用ToList(),此时数据库才真正被访问
//然后我们返回列表
}
//使用语句后,将调用ObjectContext上的Dispose方法,从而释放ObjectContext,然后关闭我的DB连接并将其释放到池中
}
现在,我不想这样做,我希望我的DAL将IQueryable返回到我的BLL,而不是列表,这样我的BLL可以对返回的IQueryable执行类似Skip()的过滤,然后在BLL中调用ToList()。所以代码变成这样
public IQueryable<User> GetUsers()
{
// do some linq select operation which returns IQueryable<User>
// then just return what we got back
// Note: no DB access occurred here, this is called deferred execution, because the real DB access happens later in BLL
}
public IQueryable GetUsers()
{
//执行一些返回IQueryable的linq select操作
//那就把我们得到的还给我
//注意:这里没有发生数据库访问,这被称为延迟执行,因为真正的数据库访问发生在BLL的后面
}
然后在我的BLL中我有一个方法
public List<User> GetUsers()
{
// get IQueryable<User> from DAL to a var say users
return users.Skip(10).Take(20).ToList(); // here the DB access really happens. Note: if we put using in DAL, here will throw exception saying DB is already closed!!
}
公共列表GetUsers()
{
//从DAL获取IQueryable到var用户
return users.Skip(10).Take(20).ToList();//这里确实发生了对数据库的访问。注意:如果我们在DAL中使用using,这里将抛出异常,表示数据库已经关闭!!
}
我的问题是,
编辑:我不明白的一点是,如果连接由ObjectContext巧妙地管理,那么不处理ObjectContext就可以了吗?除了ObjectContext之外,还有什么可以管理的呢?我倾向于将EF ObjectContext视为DAL,它解决了这个问题。如果您希望自己的DAL封装EF内容(IMO,这不是一个可怕的想法),我建议让您的DAL实现IDisposable 我倾向于将EF ObjectContext视为DAL,它解决了这个问题。如果您希望自己的DAL封装EF内容(IMO,这不是一个可怕的想法),我建议让您的DAL实现IDisposable如果你是在一个网站的背景下,你应该认真考虑,使你的对象上下文在请求中仍然存在。 您需要为延迟加载保留ObjectContext,现在就解决这个问题
连接在查询和保存过程中按需打开和关闭,因此不应该有“连接泄漏”。 如果你在网站的上下文中,你应该认真考虑使你的ObjeCurror在请求中存活。 您需要为延迟加载保留ObjectContext,现在就解决这个问题
在查询和保存更改过程中,会根据需要打开和关闭连接,因此您不应该有“连接泄漏”。如果您希望并可查询ToList()结果,则可以通过查询ToList()结果来完成此操作,如果您希望并可查询ToList()结果,则返回该结果结果并返回与您的问题相关的:
关于你的问题:
非常感谢您对连接的评论。让ObjectContext保持活动状态,您的意思是我可以不处理它,或者换言之,我不需要使用statment来处理周围的代码吗?不,它应该实例化一次,并在请求周期结束时处理。如果您使用的是Web服务,那么这很容易做到,在WebForms应用程序中可能会更棘手。您仍然应该处理上下文,但是请求中的所有操作都应该在一个上下文上执行。非常感谢您对连接的评论。让ObjectContext保持活动状态,您的意思是我可以不处理它,或者换言之,我不需要使用statment来处理周围的代码吗?不,它应该实例化一次,并在请求周期结束时处理。这很容易做到,如果你