处理ObjectResult <t> </t>

时间:2013-07-09 12:53:30

标签: entity-framework-4 idisposable

我开始使用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上也似乎存在很多不一致的问题。

1 个答案:

答案 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;
}