在基类C#

时间:2015-06-20 14:54:13

标签: c# entity-framework repository-pattern base-class

我有很多使用DbContext变量的存储库类。初始化此DbContext变量的最佳做法是什么?

我正在尝试使用继承IDisposable在Base类中执行此操作,但我的应用程序在一次操作中进行了大量操作,并且我得到 DataReader忙碌错误。但是当我在这个函数里面使用时:using(var _entities = MyDbContext.Create())一切都很好吗?什么是问题,什么是解决问题的最佳方法?

现在我的基类看起来像这样:

public abstract class BaseRepository : IDisposable
    {
        protected readonly MyDbContext_entities;
        public BaseRepository()
        {
            _entities = MyDbContext.Create();
        }
        #region Implement IDisposable
        private bool disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    _entities.Dispose();
                }
            }
            this.disposed = true;
        }

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

和我使用的一个repo使用构造函数获取此值:

public MyRepo():base(){};

功能MyDbContext.Create()

public static MyDbContext Create()
{
      return new MyDbContext();
}

2 个答案:

答案 0 :(得分:1)

最佳做法是将注入 DbContext实例注入构造函数中,或者甚至更好地注入Func<DBContext>,然后您可以基于每个方法控制db上下文的生命周期。而且你不再需要一个用于此目的的基类了。

这当然需要使用DI容器,这在asp.net mvc中是微不足道的。

答案 1 :(得分:0)

我认为_entities变量类型和变量名称之间缺少空格。

如果你的MyDbContext.Create()返回MyDbContext类型以外的东西,我想你应该让一些泛型集合返回值。 因此,您可以在没有&var;&#39;对于每种方法的_entities类型,您将使用您的泛型类型。

如果您没有尝试c#的通用功能 您可以尝试寻找泛型类和泛型方法的主题。