Entity Framework 工作单元生命周期

Entity Framework Unit of Work lifetime

我正在尝试学习 entity framework 和相关模式。在搜索时我发现了这个网站:http://www.asp.net/mvc...

我检查了模式,但我无法理解一点。根据我的调查,dbcontex 的生命周期应该非常短,因为它有内存中的对象模型,这些更改应该尽快保存到数据库中。否则多用户场景下会出现冲突

当我查看上面的教程时,我发现对于每个控制器都只定义了一个 uow。我想知道这是否意味着只要我在站点的一页上执行 CRUD 操作,我就会使用相同的 dbcontext。但是它的寿命不应该更短吗?例如,可以为每个动作定义一个 uow。

谁能解释一下 uow 的生命周期?

调用的每个动作都是控制器的一个新实例。只需在您的控制器构造函数中设置一个断点,您就会看到每次您对控制器上的任何操作发出请求时都会调用它。

通常,在 Web 应用程序中,DBContext 的范围是每个 Web 请求。因此,如果您将 DBContext 注入到您的控制器中,通常会为您提供所需的内容。

DbContext 定义为私有 class 变量与将其定义为局部变量应该没有任何区别。

每次创建 HTTP 请求时,都会初始化控制器(以及它的任何 class 变量)并调用操作。控制器的实例不会在不同的请求之间持续存在,DbContext.

的任何实例也不会

查看这篇关于 why you don't have to worry about the lifetime of a DbContext 的文章。

编辑

我在发布这个答案几天后意识到一个警告,如果我没有更新它我会感到内疚。

如果每个动作都使用您的 DbContext,则上述陈述为真。但是,如果只有少数操作使用它,则最好改用局部范围的 DbContext。这将防止在您调用不需要使用变量的操作时不必要地创建 DbContext class 变量。这会让你的代码更有效率吗?是的 - 但微不足道 - 每次你想使用它时你都必须实例化一个 DbContext ,这将导致 稍微 比只有一个 [=] 更混乱的代码33=]-顶部的变量。

在给出的示例中,控制器负责创建 DbContext 的实例并进行处理。更好的做法是让IoC容器负责DbContext实例的生命周期控制,并实现构造函数注入将DbContext注入MVC/WebApi控制器

至于 WCF 服务,我的偏好是指示以下属性 [服务行为(InstanceContextMode = InstanceContextMode.PerCall)] 服务,并指定 DbContext 的生命周期,以便每次调用只创建一个 DbContext 实例。

如果要为 WCF 服务或 MVC/WebApi 实施 DI,您可能需要进行一些生命周期管理。 参考:https://msdn.microsoft.com/en-us/library/dn178463(v=pandp.30).aspx#_Lifetime_Management

这个post也是强烈推荐给你的问题。 One DbContext per web request... why?