EntityFramework:通过工作单元模式为每个请求保留实体上下文

时间:2013-04-16 15:15:49

标签: c# asp.net-mvc unit-of-work

有很多关于工作单元格的信息,但大多数都是不同的。

我已经知道我应该为每个请求提供我自己的实体上下文。我应该使用工作单元模式来实现这一目标(从这里开始。Entity Framework and Connection Pooling

所以我用这种方式实现了它:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

但是只有那个实现,每个请求我没有一个上下文,所有请求都共享相同的上下文,对吧?

然后我找到了这个链接:http://www.mindscapehq.com/blog/index.php/2008/05/12/using-the-unit-of-work-per-request-pattern-in-aspnet-mvc/

但是现在我记得我应该在session / HttpContext.Items变量中保存上下文。是吗?

我在哪里可以找到最佳实施教程?

1 个答案:

答案 0 :(得分:2)

我遵循second link中给出的模式。您没有使用该模式在所有请求之间共享上下文。看一下示例代码:

public class StudentController : Controller
{
    private IStudentRepository studentRepository;

    public StudentController()
    {
        this.studentRepository = new StudentRepository(new SchoolContext());
    }
}

对于Student控制器的每个请求,将创建该类的新实例。在该类的构造函数中,它使用新上下文创建新的存储库实例。这意味着上下文仅在该请求的生命周期内存在。

修改:这里有一点澄清:

也许在这个过程中退步有助于澄清。首先让访问者在您的控制器中执行某些操作。 ASP.NET将创建一个控制器类的实例。当它创建该实例时,您将在内存中有一个上下文在该请求期间生效,不再

这很好,因为您正在控制器中执行工作。比如用户要求更新其个人资料的示例。你会如何处理实体框架(EF)?首先,您将使用您的存储库并获取其用户记录。您的上下文现在知道该对象。然后,您获取访问者提供的数据(假设他们想要更改他们的电话号码)并使用新值更新您的EF对象。上下文是跟踪这些更改,因此在您的操作结束时,您可以调用.Save(),并对您的数据库进行适当的更新。