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

如何在c#中处理上下文变量?,c#,asp.net-mvc,entity-framework,dispose,using-statement,C#,Asp.net Mvc,Entity Framework,Dispose,Using Statement,我想在下面的代码中处理devDB上下文对象 private static void InitContainer() { var devDB = new TestContext(constr); Container .RegisterInstance<TestContext>(devDB) .RegisterInstance&

我想在下面的代码中处理
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();
    }
}
使用


如果变量是可弃置的,它将自动
Dispose
您的变量。

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

 private static void InitContainer()
 {
       using(var devDB = new TestContext(constr))_
       {  
                 Container                 
                    .RegisterInstance<TestContext>(devDB)
                    .RegisterInstance<IRepository<User>>(new Repository<User>(devDB))
       }
  }
private static void InitContainer()
{
使用(var devDB=newtestcontext(constr))_
{  
容器
.RegisterInstance(devDB)
.RegisterInstance(新存储库(devDB))
}
}
using语句确保调用Dispose,即使 调用对象上的方法时发生异常。你可以 通过将对象放入try块并 然后在finally块中调用Dispose;事实上,这就是 using语句由编译器翻译。代码示例 前面的代码在编译时扩展为以下代码(注意额外的 使用大括号创建对象的有限范围)

using块将转换为try finally块,如下所示。还要注意的是,您将无法访问被释放后的上下文

{
        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();
         }
  }
{
TestContext devDB=新的TestContext(“Arial”,10.0f);
尝试
{
devDB=新的测试上下文(constr);
容器
.RegisterInstance(devDB)
.RegisterInstance(新存储库(devDB))
}
最后
{
如果(devDB!=null)
((IDisposable)devDB.Dispose();
}
}

您所使用的代码没有显示出在函数外使用
context
的任何迹象,您可以从方法中返回数据,而不是查询,这样就不再需要上下文了。

我尝试过这样做,但数据库连接没有打开,而在我的代码中声明了这样的内容。我想OP已经尝试了
使用
块,因为OP说:
我尝试过使用语句,但代码不是运行
@user3106578您所说的
是什么意思,但代码没有运行
,您是否遇到任何异常?获取“ObjectContext实例已被释放,无法再用于需要连接的操作。”@user3106578是否确实使用块在
中编写所有代码?使用using语句获取“ObjectContext实例已被释放,不能再用于需要连接的操作”。我尝试了上面的代码,但遇到了相同的错误。ObjectContext实例已被释放,无法再用于需要连接的操作您所使用的代码没有显示任何在函数外部使用上下文的迹象,您可以从方法返回数据而不是查询,这样就不再需要上下文。如何避免sonar引发的EnsureLocalDisposalRule错误?如何处置devDB?什么是“代码未运行”?您能用您得到的错误以及错误发生的时间更新您的问题吗?获取“ObjectContext实例已被释放,不能再用于需要连接的操作”。此外,您使用的是实体框架还是其他?仅实体框架@SAM请告诉我处置devDB对象的解决方案。问题尚未解决。
 private static void InitContainer()
 {
       using(var devDB = new TestContext(constr))_
       {  
                 Container                 
                    .RegisterInstance<TestContext>(devDB)
                    .RegisterInstance<IRepository<User>>(new Repository<User>(devDB))
       }
  }
{
        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();
         }
  }