我不同意所有四点:
被自动关闭/设置防止连接(将在使用块的结尾关闭 )。
在我看来,如果在方法级别,存储库实例级别或请求级别上处理上下文,则无关紧要。 (你有当然在单个请求结束时处理上下文 - 通过将存储库方法包装在using
声明中或通过在存储库类上实现IDisposable
(如您所建议的)并将存储库实例包装在using
语句或通过在控制器构造函数中实例化存储库并将其置于控制器类的重写中 - 或者在请求开始时通过实例化上下文并在请求结束时进行处理(某些依赖注入容器将有助于做这个工作)。)为什么上下文应该“自动处理”?在桌面应用程序中,每个窗口/视图都有一个可能会打开几个小时的上下文是可能的和常见的。
有助于迫使你只能拉入内存,你需要什么样的 特定视图/视图模型,并在更短的往返(你会得到任何你试图延迟加载一个 连接错误)。
老实说,我会通过完全禁用延迟加载来强制执行此操作。我没有看到在客户端与服务器断开连接的Web应用程序中进行延迟加载的好处。在你的控制器动作中,你总是知道你需要加载什么,并且可以使用急切或显式加载。为避免内存开销并提高性能,您可以始终禁用GET请求的更改跟踪,因为EF无论如何都无法跟踪客户端网页上的更改。
控制器内的子实体的访问/查看仅限于什么 你调用包括()
这是相当具有优势不是一个劣势,因为你没有的unwished惊喜延迟加载。如果您需要在控制器动作后填充子实体,这取决于一些条件,你可以通过额外的储存库的方法(LoadNavigationProperty
或东西)具有相同或甚至一个新的上下文加载它们。
对于像仪表板指数显示,从 许多表(很多不同的版本库的方法调用)收集的信息的网页,我们将添加 开销创建和处理许多实体容器。
创建上下文 - 我不认为我们正在谈论数百或数千个实例 - 是一种便宜的操作。我认为这是一个非常理论化的开销,在实践中没有发挥作用。
我使用这两种方法,你在web应用中提到,也是第三个选项,即创建每个请求一个上下文并注入同样的情况下到每一个存储库/服务,我需要在一个控制器动作。他们三人都为我工作。
当然,如果你使用,你必须要小心做同一个工作单位的各项工作,以避免安装实体多个上下文,这将导致众所周知的例外多个上下文。避免这种情况通常不是问题,但需要更多的关注,特别是在处理POST请求时。
我最近使用每个请求的上下文,因为它更容易,我只是没有看到有非常狭窄的上下文的好处,我没有理由在整个请求处理中使用多个工作单元。如果我需要多个上下文 - 无论出于何种原因 - 我总是可以创建专门的方法来处理它们自己的上下文,而不是请求的“默认上下文”。
关闭主题?真的吗?我可以看到关闭不是建设性的(虽然我也会反对这一点,但肯定比“off topic”更准确) – 2012-04-18 17:51:02