我开始使用Entity Framework(数据库优先),我注意到tt模板为上下文类(对于存储过程)生成的方法具有返回类型ObjectResult。
这种类型是IDisposable,但我找不到的示例代码实际上调用了Dispose方法。是否有一个原因?
我目前没有在存储过程调用上使用“using”,因为我在结果上进一步使用IEnumerable相关的东西(基本上只是投影结果集),但我可以很容易地重构它。
我的问题是,如果我没有理由保持与数据库的连接打开,我是否应该使用如下的模式:
using (var context = new DatabaseContext())
{
using (var result = context.spMyStoredProcedure(param1, param2))
{
return result.ToList();
}
}
我已经看到一些建议,甚至可能不需要处理DbContext,但即使在MSDN上也似乎存在很多不一致的问题。
答案 0 :(得分:0)
我反编译ObjectResult<T>
(EF4。)这是Dispose()
方法。它正在创建其他托管对象,例如DbDataReader
。以及一个名为Shaper
的内部对象,它可以拥有数据库连接。
如果你处理它,你就会相信它知道它在做什么。如果你不相信,你相信自己知道它在做什么,不做什么,为什么。我安全地玩它并处理它。
public override void Dispose()
{
DbDataReader reader = this._reader;
this._reader = (DbDataReader) null;
this._nextResultGenerator = (NextResultGenerator) null;
if (reader != null && this._readerOwned)
{
reader.Dispose();
if (this._onReaderDispose != null)
{
this._onReaderDispose((object) this, new EventArgs());
this._onReaderDispose = (Action<object, EventArgs>) null;
}
}
if (this._shaper == null)
return;
if (this._shaper.Context != null && this._readerOwned)
this._shaper.Context.ReleaseConnection();
this._shaper = (Shaper<T>) null;
}