实体框架 - 初始化基类 C# 中存储库的数据库上下文

本文关键字:存储 数据库 上下文 框架 初始化 基类 实体 | 更新日期: 2023-09-27 17:57:23

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

我正在尝试使用继承IDisposable在基类中执行此操作,但是我的应用程序一次进行了大量操作,并且我遇到了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
    }

我的一个存储库使用构造函数获取此值:

public MyRepo():base(){};

功能MyDbContext.Create()

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

实体框架 - 初始化基类 C# 中存储库的数据库上下文

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

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

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

如果你的MyDbContext.Create()返回的不是MyDbContext类型,我认为你应该让一些泛型集合返回值。因此,对于每个方法_entities类型,您可以释放实体而不使用"var",因此您可以改用泛型类型。

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