Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实体框架、Linq、ObjectContext和延迟执行问题?_Linq_Entity Framework - Fatal编程技术网

实体框架、Linq、ObjectContext和延迟执行问题?

实体框架、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. { //

我是Linq to EntityFramework的新手,Linq2EntityFramework中的一个问题是何时或是否处理ObjectContext。我问这个问题的原因是,通常在我的DAL中,我有如下代码

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,这里将抛出异常,表示数据库已经关闭!!
}
我的问题是,

  • 如果我使用第二种方法,Linq2EF会知道在上述方法完成后关闭我的连接吗
  • 使用第二种方法,ObjectContext永远不会被处理,这在大型站点上会是一个问题吗
  • 或者如何使IQuerayable返回,但仍在DAL中处理ObjectContext
  • 非常感谢你, 雷


    编辑:我不明白的一点是,如果连接由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()结果,则返回该结果结果并返回与您的问题相关的

  • 它将关闭open并关闭与ToList的连接,因为所有枚举都发生在该位置。唯一可以让您使用长时间打开的连接的地方是,如果您对它进行枚举并对每个项目运行一些半长处理
  • 对于正常的大型站点和正常操作,您可以接受这一点。让您陷入麻烦的主要事情是实体跟踪,它涉及到您加载的任何实体。如果你正在加载太多的信息或者有一个非常大的站点,你可以避免使用它(对于一个普通的站点不要担心)
  • 您可以让数据访问类实现IDisposable,并在处理datacontext时对其进行处理。因此,在GetUsers中,您可以在数据访问类周围放置一个using

  • 关于你的问题:

  • 它将关闭open并关闭与ToList的连接,因为所有枚举都发生在该位置。唯一可以让您使用长时间打开的连接的地方是,如果您对它进行枚举并对每个项目运行一些半长处理
  • 对于正常的大型站点和正常操作,您可以接受这一点。让您陷入麻烦的主要事情是实体跟踪,它涉及到您加载的任何实体。如果你正在加载太多的信息或者有一个非常大的站点,你可以避免使用它(对于一个普通的站点不要担心)
  • 您可以让数据访问类实现IDisposable,并在处理datacontext时对其进行处理。因此,在GetUsers中,您可以在数据访问类周围放置一个using

  • 非常感谢您对连接的评论。让ObjectContext保持活动状态,您的意思是我可以不处理它,或者换言之,我不需要使用statment来处理周围的代码吗?不,它应该实例化一次,并在请求周期结束时处理。如果您使用的是Web服务,那么这很容易做到,在WebForms应用程序中可能会更棘手。您仍然应该处理上下文,但是请求中的所有操作都应该在一个上下文上执行。非常感谢您对连接的评论。让ObjectContext保持活动状态,您的意思是我可以不处理它,或者换言之,我不需要使用statment来处理周围的代码吗?不,它应该实例化一次,并在请求周期结束时处理。这很容易做到,如果你