Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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
C# EntityFramework中的ObjectDisposedException_C#_Entity Framework_.net 4.0_Entity Framework 5 - Fatal编程技术网

C# EntityFramework中的ObjectDisposedException

C# EntityFramework中的ObjectDisposedException,c#,entity-framework,.net-4.0,entity-framework-5,C#,Entity Framework,.net 4.0,Entity Framework 5,我有这个类,当使用方法ExecuteQuery时,我经常(但不总是)得到NullReferenceException或ObjectDisposedException: public class Dao { protected StoreDbContext Context = new StoreDbContext(); public IEnumerable<T> ExecuteQuery<T>(string query, params object[] p

我有这个类,当使用方法ExecuteQuery时,我经常(但不总是)得到NullReferenceException或ObjectDisposedException:

public class Dao
{
    protected StoreDbContext Context = new StoreDbContext();

    public IEnumerable<T> ExecuteQuery<T>(string query, params object[] parameters)
    {
        return  Context.Database.SqlQuery<T>(query, parameters).ToList();
    }

}
公共类Dao
{
受保护的StoreDbContext上下文=新的StoreDbContext();
公共IEnumerable ExecuteQuery(字符串查询,参数对象[]参数)
{
返回Context.Database.SqlQuery(query,parameters.ToList();
}
}
但是,若我将在方法中创建上下文,我不会得到任何异常。为什么?

public class Dao
{
    protected StoreDbContext Context = new StoreDbContext();

    public IEnumerable<T> ExecuteQuery<T>(string query, params object[] parameters)
    {
        return  new StoreDbContext().Database.SqlQuery<T>(query, parameters).ToList();
    }

}
公共类Dao
{
受保护的StoreDbContext上下文=新的StoreDbContext();
公共IEnumerable ExecuteQuery(字符串查询,参数对象[]参数)
{
返回新的StoreDbContext().Database.SqlQuery(查询,参数).ToList();
}
}

执行更新时,不要让StoreDbContext挂起。它将以过时的数据/实体结束。可接受的模式是为工作单元/作用域操作集启动新上下文。第二个示例可能是可以接受的,但您需要确保通过使用using语句创建上下文来处理上下文。重构方法以解决此问题


我倾向于将搜索结果保存在一个单独的上下文中,不进行跟踪(只读),但会使用一个新的上下文进行更新,因为我使用的是WCF数据服务。

在进行更新时,不要让StoreDbContext挂在旁边。它将以过时的数据/实体结束。可接受的模式是为工作单元/作用域操作集启动新上下文。第二个示例可能是可以接受的,但您需要确保通过使用using语句创建上下文来处理上下文。重构方法以解决此问题


我倾向于将搜索结果保存在单独的上下文中,不进行跟踪(只读),但会使用新上下文进行更新,因为我使用的是WCF数据服务。

第二个示例也不正确:新创建的上下文永远不会被处理。通过在
ExecuteQuery
中处理上下文来修复该问题,因为返回的对象可能引用该上下文,因此该上下文将被过早地处理。@hvd我同意处理,但是ToList()正在返回一个全新的变量,因此using语句中列表的返回应该完全可以接受。列表是一个全新的对象,但该列表中包含的对象可能会根据类型保留对上下文的引用(例如,对于延迟加载或更改跟踪)。你说“没有跟踪”,你是对的,那就没问题了。第二个例子也不对:新创建的上下文永远不会被处理。通过在
ExecuteQuery
中处理上下文来修复该问题,因为返回的对象可能引用该上下文,因此该上下文将被过早地处理。@hvd我同意处理,但是ToList()正在返回一个全新的变量,因此using语句中列表的返回应该完全可以接受。列表是一个全新的对象,但该列表中包含的对象可能会根据类型保留对上下文的引用(例如,对于延迟加载或更改跟踪)。你说“没有跟踪”,你是对的,那就没问题了。