处理我的ObjectContext的正确方法是什么?

Xai*_*oft 3 c# datacontext entity-framework .net-3.5 asp.net-mvc-3

我不太清楚如何正确的方法DisposeObjectContext是.这是我的设置方式:

public abstract class DataManagerBase<T> where T:ObjectContext
{
    protected T _context = null;

    public string Message { get; set; }

    public DataManagerBase(T context)
    {
       _context = context;
    }
}
Run Code Online (Sandbox Code Playgroud)

要在其他类中使用它,我做的事情如下:

public class Test : DataManagerBase<DataEntities>
{
     public Test(DataEntities context) 
        : base(context){}

     public void InsertRecord(Person p)
     {
         if(_context != null)
         {
             try
             {
                 //Do insert logic
             }
             catch(Exception ex)
             {

             }
         }
    }

}
Run Code Online (Sandbox Code Playgroud)

我有其他方法使用相同的_context,所以我没有使用using语句,所以_context如果抛出异常然后处置它,我应该检查是否为空?基本上我想确保_context在我完成时被处理,无论是否有异常.将添加finally到每一个try/catch是不正确的?

将此方法添加到我的DataManagerBase类,然后在其他类中调用它可以做到这一点:

 public void DisposeContext()
 {
        if (_context != null)
        {
            _context.Dispose();
        }
 }
Run Code Online (Sandbox Code Playgroud)

Nik*_*a B 5

拇指的规则是:不要处理你没有创建的对象.因此,您不应将您的上下文置于您提供的任何类中.

但是context.Dispose(),您应该在课堂上调用,实际创建此特定实例.当你这样做时 - 应该没有其他对象使用它.你要做的是避免设计问题,而不是修复它.这是错的,imho.当你忘记在某个地方再次进行无效检查时,这会在某些时候咬你.

使用您提供的代码示例可能如下所示:

void SomeMethodInOuterScope()
{
    var context = new DataEntities();

    var test = new Test(context);

    try
    {
        test.InsertRecord(new Person());
        ...............
    }
    catch(Exception ex)
    {
        ....
    }
    finally
    {
        context.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是另一个例子(当上下文不是本地的时)

class SomeClassInOuterScope : IDisposable
{
    private DataEntities _context;

    public SomeClassInOuterScope()
    {
        _context = new DataEntities();
    }

    public void Test()
    {
        var test = new Test(_context);
        test.InsertRecord(new Person());
        ...............
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}

void SomeMethodInOuterOuterScope()
{
    var someclass = new SomeClassInOuterScope();

    try
    {
        someclass.Test();
        ...............
    }
    catch(Exception ex)
    {
        ....
    }
    finally
    {
        someclass.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)