实体框架工作寿命单位
本文关键字:单位 工作 框架 实体 | 更新日期: 2023-09-27 18:01:00
我正在尝试学习实体框架和相关模式。在搜索时,我发现了这个网站:http://www.asp.net/mvc...
我检查了一下图案,但一点也不明白。根据我的调查,dbcontext的生存期应该很短,因为它有内存中的对象模型,这些更改应该尽快持久化到数据库中。否则,在多用户场景中会发生冲突。
当我看上面的教程时,我发现每个控制器只有一个定义的uow。我想知道这是否意味着只要我在网站的一个页面上进行CRUD操作,我就会使用相同的dbcontext。但它的寿命不应该更短吗?例如,对于每个操作,都可以定义一个uow。
有人能解释一下你的一生吗?
将DbContext
定义为私有类变量与将其定义为局部变量没有任何区别。
每次创建HTTP请求时,都会初始化控制器(以及它的任何类变量(并调用该操作。控制程序的实例不会在不同的请求之间持久存在,DbContext
的任何实例也不会持久存在。
看看这篇关于为什么你不必担心DbContext的生存期的文章。
编辑
在我发布这个答案几天后,我意识到了一个警告,如果我没有更新它,我会感到内疚
如果每个操作都使用您的DbContext
,则上述语句成立。然而,如果只有少数操作使用它,那么最好使用本地范围的DbContext
。这将防止在任何时候调用不需要使用的操作时不必要地创建DbContext
类变量。这会提高代码的效率吗?是的,但不重要的是,每次使用DbContext
时都必须实例化它,这将导致比顶部只有一个类变量更混乱的代码。
被调用的每个操作都是控制器的一个新实例。只需在控制器构造函数中设置一个断点,您就会看到每次对控制器上的任何操作发出请求时都会调用它。
通常,DBContext的作用域是web应用程序中的每个web请求。因此,如果您将DBContext注入控制器,它通常会为您提供所需的内容。
在给定的示例中,控制器负责创建DbContext的实例并进行处置。更好的做法是让IoC容器负责DbContext实例的生存期控制,并实现构造函数注入,将DbContext注入MVC/WebApi控制器。
至于WCF服务,我倾向于指出以下属性[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall(]并指定DbContext的生存期,以便每次调用只创建一个DbContext实例。
如果要为WCF服务或MVC/WebApi实现DI,您可能需要进行一些生存期管理。参考编号:https://msdn.microsoft.com/en-us/library/dn178463(v=pandp.30(.aspx#_Lifetime_Management
对于您的问题,我们也强烈推荐您发这篇文章。每个web请求一个DbContext。。。为什么?