在过去的几个月里,我将我的Webforms知识迁移到MVC知识,我不得不说,在最初成为MVC怀疑论者后,我喜欢MVC及其工作方式。
我还有点不清楚的是静态类是如何在MVC中保留的。在Webforms中,静态类值在访问应用程序的不同客户端之间共享,如果您决定使用静态类来保存用户相关变量,则可能导致用户覆盖其他用户值。
我的第一个问题是MVC中是否仍然如此?
然后我的第二个问题是关于将DBContext实例保存在我的MVC应用程序中的位置。目前我将它作为静态DAL类中的公共变量。然后在所有客户端之间共享单个上下文。
我读到的越多,我就越开始相信这是不正确的方法,但重新创建每个控制器内的上下文似乎是重复的。
将Context置于静态类中是否存在缺点?
答案 0 :(得分:1)
在应用程序的生命周期内保留单个 DbContext 实例对我来说听起来不是一个好主意。我通常每DbContext
使用一个Request
个实例。
在您的应用中确定DbContext
的适当生命周期时,您可能需要考虑以下两点:
为多个请求重复使用相同的上下文可让您受益 缓存实体,你可以保存许多命中数据库但是 然后你可能会遇到性能问题,因为你可能最终会遇到问题 在某个时间将所有数据库实体都放在内存中。
另一方面,经常重新实例化上下文也不是 推荐,因为这是一项昂贵的操作。
您必须在这两种方法之间找到平衡点,对我来说,实例化DbContext
每次请求在大多数情况下效果最佳。
答案 1 :(得分:1)
DbConext不是线程安全的,EF只允许在同一个上下文中进行一次同步操作。因此,跨请求分享它并不是一个好主意。 在大多数情况下,每个请求的上下文是最佳解决方案。 (提示:有一些IoC框架,如autofac,可以为每个请求创建实例)
答案 2 :(得分:0)
上下文应该是短暂的,因此它可能看似重复,但是,是的,在每个控制器内部创建一个上下文。每个请求使用一个上下文是准确的。