实体框架 - 初始化基类 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();
}
最佳做法是将 DbContext 实例注入构造函数中,或者更好地注入Func<DBContext>
然后您可以基于每个方法控制数据库上下文的生命周期。而且您将不再需要基类来实现此目的。
当然需要使用 DI 容器,这在 asp.net mvc 中是微不足道的。
我认为_entities变量类型和变量名称之间缺少空格。
如果你的MyDbContext.Create()返回的不是MyDbContext类型,我认为你应该让一些泛型集合返回值。因此,对于每个方法_entities类型,您可以释放实体而不使用"var",因此您可以改用泛型类型。
如果您还没有尝试过 C# 的通用功能您可以尝试查找泛型类和泛型方法的主题。