我有这个类,当使用方法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();
}
}
但是,如果我将在方法中创建Context,我不会得到任何异常。为什么呢?
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();
}
}
答案 0 :(得分:4)
执行更新时不要让StoreDbContext保持不变。最终会有过时的数据/实体。接受的模式是为工作单元/范围操作集启动新的上下文。第二个示例可能是可接受的,但您需要确保通过使用using语句创建上下文来处置它。重构方法以解决这个问题。
我倾向于将搜索结果保存在单独的上下文中,没有跟踪(只读),但会使用新的上下文进行更新,因为我正在使用WCF数据服务。