我对如何在使用实体框架的应用程序中组织与数据层的连接(存储库类)感到困惑。

你会怎么写呢?为什么?

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,因此工作单元是对单个请求的响应。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top