我有这个类,当使用方法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();
    }

}


但是,如果我将在方法中创建上下文,则不会出现任何异常。为什么?

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();
    }

}

最佳答案

在进行更新时,请勿使StoreDbContext保持混乱。最终将带有陈旧的数据/实体。可接受的模式是为工作单元/范围内的操作集启动新的上下文。第二个示例可能是可以接受的,但是您需要通过使用using语句创建上下文,以确保您处置了该上下文。重构方法以解决此问题。

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

10-08 02:16