【问题标题】:How to implement IDisposable in Entity Framework?如何在实体框架中实现 IDisposable?
【发布时间】:2013-03-01 14:34:14
【问题描述】:

我在一个单独的 EL 层中拥有我的实体框架上下文,它代表实体层,然后我转到 DAL,然后是 BL 和我的用户界面 aspx.cs 代码页。 我很困惑如何在相同的情况下使用 IDisposable。 到目前为止我在做什么,假设在我的 DAL 中我有我的实体的上下文。

namespace abc
{
    public class Action: IDisposable
    {
        Entities context = new Entities();
        // all the methods

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

这样做是否正确? 我只是一个天真的程序员,所以请帮助我学习相同的逻辑。

【问题讨论】:

  • DAL 中是否存在 Action 类?
  • 不,这只是一个类的名称,我在进一步创建的方法中使用实体类。

标签: c# entity-framework implementation idisposable


【解决方案1】:

我个人会稍微改一下,比如: 虽然我在实体框架中实现IDisposable 的经验很少。

namespace abc
{
    public class Action: IDisposable
    {
        private bool _disposed;

        Entities context= new Entities();
        // all the methods

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    context.Dispose();
                    // Dispose other managed resources.
                }
                //release unmanaged resources.
            }
            _disposed = true;
        }
    }
}

【讨论】:

  • 好吧,让我实现同样的,我会恢复,因为我实际上是在进行代码分析并且我收到了这个警告,所以让我检查一下我是否做得正确。
  • 不,它要求我重写方法。
  • 它要求覆盖哪个方法?哪个班的?
  • 非常感谢,我现在可以删除这些警告了。
【解决方案2】:

一般来说,是的,您的Dispose 方法应该处理所有实现IDisposable 的资源以及非托管资源(文件等)

但是,将 EF 上下文作为 资源 来保存通常不是一个好的设计。如果您在 Action 方法中创建 Context 并在完成后将其丢弃,您可能会获得更好的成功。那么,如果这是你唯一的资源,你就不需要实现IDisposable

【讨论】:

  • 我不知道如何使用它,再次令人困惑。:(
  • 你的用法是正确的;我只是指出 EF 上下文通常是在方法调用中创建和处理的,而不是作为类的属性保留。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多