如何在c#中处理上下文变量?

时间:2014-01-22 04:36:17

标签: c# asp.net-mvc entity-framework dispose using-statement

我想在下面的代码中处理devDB上下文对象。

private static void InitContainer()
{
     var devDB = new TestContext(constr);  
                 Container                 
                    .RegisterInstance<TestContext>(devDB)
                    .RegisterInstance<IRepository<User>>(new Repository<User>(devDB))
}

private static void CleanUp()
{
    if (Container != null)
    {
        Container.Dispose();
    }
}

我尝试了using语句,但是我收到以下错误:

  

ObjectContext实例已被释放,不能再用于需要连接的操作。

如何正确处理devDB

编辑:

using (var devDB = new TestContext(constr))
            {

                var peopleService = new Peoplews();
                Container

                    .RegisterInstance<TestContext>(devDB)
                    .RegisterInstance<IRepository<User>>(new Repository<User>(devDB))
                    .RegisterInstance<IRepository<Role>>(new Repository<Role>(devDB))
                    .RegisterInstance<IRepository<Profile>>(new Repository<Profile>(devDB))
                    .RegisterInstance<IRepository<Application>>(new Repository<Application>(devDB))
    }

2 个答案:

答案 0 :(得分:1)

使用using statements:

using(var devDB = new TestContext(constr))
{
    // rest of your code
}

如果变量是Dispose

,它会自动Disposable.

答案 1 :(得分:1)

您可以使用using语句块隐式调用dispose方法

 private static void InitContainer()
 {
       using(var devDB = new TestContext(constr))_
       {  
                 Container                 
                    .RegisterInstance<TestContext>(devDB)
                    .RegisterInstance<IRepository<User>>(new Repository<User>(devDB))
       }
  }
  

using语句确保即使调用Dispose也会调用   在对象上调用方法时发生异常。您可以   通过将对象放在try块中来实现相同的结果   然后在finally块中调用Dispose;其实这是怎么回事   using语句由编译器翻译。代码示例   之前在编译时扩展为以下代码(请注意额外的   花括号来创建对象的有限范围),MSDN

使用块将转换为try finally block,如下所示。另请注意,您在处理后无法访问上下文。

{
        TestContext devDB  = new TestContext("Arial", 10.0f);
         try
         {
             devDB = new TestContext(constr);  
             Container                 
                .RegisterInstance<TestContext>(devDB)
                .RegisterInstance<IRepository<User>>(new Repository<User>(devDB))
         }
         finally
         {
            if (devDB != null)
               ((IDisposable)devDB).Dispose();
         }
  }

您所遇到的代码未显示在该功能旁边使用context的任何迹象,您可以返回数据而不是查询方法,以便不再需要上下文。