我有很多使用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();
}
答案 0 :(得分:1)
最佳做法是将注入 DbContext实例注入构造函数中,或者甚至更好地注入Func<DBContext>
,然后您可以基于每个方法控制db上下文的生命周期。而且你不再需要一个用于此目的的基类了。
这当然需要使用DI容器,这在asp.net mvc中是微不足道的。
答案 1 :(得分:0)
我认为_entities变量类型和变量名称之间缺少空格。
如果你的MyDbContext.Create()返回MyDbContext类型以外的东西,我想你应该让一些泛型集合返回值。 因此,您可以在没有&var;&#39;对于每种方法的_entities类型,您将使用您的泛型类型。
如果您没有尝试c#的通用功能 您可以尝试寻找泛型类和泛型方法的主题。