使用实体框架时如何组织模型存储库?
-
05-07-2019 - |
题
我对如何在使用实体框架的应用程序中组织与数据层的连接(存储库类)感到困惑。
你会怎么写呢?为什么?
public class ResearchRepository
{
public Research GetResearch (int id)
{
using (MnijenjeEntities mnijenjeContext = new MnijenjeEntities())
{
ObjectQuery<Research> researchs = mnijenjeContext.Research;
var research = (from r in researchs.Include("SurveyPaper")
where r.ResearchID == id
select r).First();
return research;
}
} //....
或者
public class ResearchRepository
{
private MnijenjeEntities mnijenjeContext;
public Research GetResearch(int id)
{
mnijenjeContext = new MnijenjeEntities();
ObjectQuery<Research> researchs = mnijenjeContext.Research;
var research = (from r in researchs.Include("SurveyPaper")
where r.ResearchID == id
select r).First();
return research;
} //....
区别在于 dataContext
对象的使用。
解决方案
我或多或少使用了后一种技术,但我不确定你是否准确地提出了正确的问题。我认为,真正的问题是“什么是工作单位?”我们需要考虑一些基本事实:
- 对同一操作使用多个 ObjectContext 比在一个操作中使用单个 ObjectContext 要困难得多。
- 长时间保留 ObjectContext 可能会消耗大量内存,并且可能会产生其他不良副作用。
- ObjectContext 本身具有一些“轻量级事务”功能,即它累积更改并可以一次性应用所有更改,并且在某种程度上,您与其他上下文中的更改隔离。
所以, ,我倾向于尝试为每个工作单元使用一个 ObjectContext,并在工作单元完成时处理该上下文。由于一个工作单元可能涉及多个存储库,因此我实例化了一个创建 ObjectContext 的 Service 类,也可以返回存储库。当我向服务请求存储库时,它会在返回新实例之前注入 ObjectContext。处置服务会立即处置上下文和所有存储库。
我每个工作单元使用一个服务实例。就我而言,我正在使用 ASP.NET MVC,因此工作单元是对单个请求的响应。
不隶属于 StackOverflow