【问题标题】:How to dispose the context variable in c#?如何在 C# 中处理上下文变量?
【发布时间】:2014-01-22 04:36:16
【问题描述】:

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

【问题讨论】:

  • “代码未运行”究竟是什么意思?您能否用您遇到的错误以及发生错误的时间更新您的问题?
  • getting "ObjectContext 实例已被释放,不能再用于需要连接的操作。"
  • 另外,您使用的是实体框架还是其他东西?
  • 仅限实体框架。 @山姆
  • 请告诉我处理 devDB 对象的解决方案。问题尚未解决。

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


【解决方案1】:

使用using statements:

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

如果它是Disposable.,它会自动Dispose你的变量

【讨论】:

  • 我试过这样,但是在我的代码中声明时数据库连接没有打开。
  • 我认为 OP 已经尝试过 using 阻止,因为 OP 说:i tried as using statement but code is not running
  • @user3106578 but code is not running 是什么意思,你有什么异常吗?
  • getting "ObjectContext 实例已被释放,不能再用于需要连接的操作。"
  • @user3106578 你确定你的所有代码都写在using 块内吗?
【解决方案2】:

可以使用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

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

您有问题的代码没有显示在函数之外使用context 的任何迹象,您可以从该方法返回 data 而不是 query 所以不再需要该上下文。

【讨论】:

  • 通过 using 语句获取“ObjectContext 实例已被释放,不能再用于需要连接的操作”。
  • 我尝试了上面的代码,我得到了同样的错误。ObjectContext 实例已被释放,不能再用于需要连接的操作
  • 您有问题的代码没有显示在函数之外使用上下文的任何迹象,您可以返回数据而不是从方法中查询,这样就不再需要上下文了。
  • 如何避免声纳引发的 EnsureLocalDisposalRule 错误?
  • 如何处理devDB?
猜你喜欢
  • 1970-01-01
  • 2019-10-12
  • 2014-02-04
  • 2022-01-17
  • 2023-02-06
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多