我为我的应用程序数据库实现了一个存储库模式。
我有:
public class EFRepository<T>
{
DbContext // My db context
public IQureable<T> GetQuery()
{
DataContext.CreateQuery(...);
}
}
现在让我说我有用户存储库:
公共类UserRepository:EFRepository { public UserGetUserDetails(int userId) { GetQuery()。Where(u =&gt; u.Id = userId).First(); } }
我的问题是当我在派生存储库中使用EF存储库时如何释放DbContext
。
让我们说:UserRepository: EFRepository
,它使用GetQuery
然后我必须处理上下文。
如何在通用存储库中创建它?
答案 0 :(得分:1)
你应该考虑一下unit of work你有什么。 (互联网上有许多其他教程)。我们的想法是保持相同的 dbcontext并在同一工作单元中重用它。这样,实体在需要它们时就已经附加到上下文等。
现在,这是一个Web应用程序,在这种情况下,您的工作单元将是一个请求。在同一请求中,重用您的DBContext。有很多方法可以做到这一点,而且只是在我的头脑中 - 你需要像OnActionExecuting这样的东西来处理你的背景。
但更好的是使用Inversion of Control模式(有许多框架使用它,我主要使用NInject。这将在需要时自动创建某个类的新实例,取决于你建议的范围 - 在这种情况下'onRequestScope'。关于IoC的更多内容,但不是问题的范围
答案 1 :(得分:0)
我过去使用了类似的模式,在我的情况下,我实际上是从DbContext
继承而来,IDisposable
本身实现了EFRepository
。如果您在using
块中使用DbContext
或从中派生的类,那么您应该没问题。
如果您更喜欢EFRepository
成员变量,则IDisposable
需要实施DbContext.Dispose()
并从Dispose
方法调用{{1}}。