2013-07-09 21 views
3

我使用实体框架(数据库第一)开始,我注意到这些方法的TT模板生成的上下文类(存储过程)返回类型ofObjectResult。处置ObjectResult <T>

这种类型是IDisposable接口,但没有示例代码其实我可以找到调用Dispose方法。是否有一个原因?

我目前没有“使用”的存储过程调用,因为我做了进一步的IEnumerable相关的东西的结果(实际上就是突出的结果集),但我可以很容易重构这一点。

我的问题是,我应该使用如下的模式,如果我没有理由保持到数据库连接打开:

using (var context = new DatabaseContext()) 
{ 
    using (var result = context.spMyStoredProcedure(param1, param2)) 
    { 
     return result.ToList(); 
    } 
} 

我已经看到了一些建议,即使配置了的DbContext可能不需要,但即使在MSDN上也有很多不一致的地方需要做什么。

回答

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