我最近开始在.NET 4.0应用程序中使用Entity Framework 4.0,并对与池相关的一些事情感到好奇。
据我所知,连接池是由ADO.NET数据提供程序管理的,在我的情况下是由MS SQL服务器管理的。实例化新实体上下文(ObjectContext
)(即无参数)时,这是否适用new MyDatabaseModelEntities()
?
a)为应用程序创建全局实体上下文(即一个静态实例)或b)使用using
块为每个给定的操作/方法创建和公开实体上下文的优缺点是什么?
我应该了解某些特定情况下的其他建议,最佳实践或通用方法吗?
如果您想知道对WPF / WinForm应用程序单个对象上下文有什么影响,请查阅本文。它是关于NHibernate Session的,但是想法是相同的。
编辑:
使用EF时,默认情况下,每个上下文仅加载每个实体一次。第一个查询创建实体实例并将其存储在内部。任何随后的需要实体具有相同键的查询都将返回此存储的实例。如果数据存储中的值发生更改,您仍然会收到来自初始查询的带有值的实体。这称为身份映射模式。您可以强制对象上下文重新加载实体,但是它将重新加载单个共享实例。
在调用SaveChanges
上下文之前,对实体所做的任何更改都不会保留。您可以在多个实体中进行更改并立即存储它们。这称为工作单元模式。您无法选择性地说出要保存的修改后的附加实体。
结合这两种模式,您将看到一些有趣的效果。您整个应用程序只有一个实体实例。对实体的任何更改都会影响整个应用程序,即使更改尚未持久(提交)。在大多数情况下,这不是您想要的。假设您在WPF应用程序中有一个编辑表单。您正在使用该实体,并决定取消复杂的编辑(更改值,添加相关实体,删除其他相关实体等)。但是该实体已经在共享上下文中被修改。你会怎么做?提示:我不知道关于的任何CancelChanges或UndoChanges ObjectContext
。
我认为我们不必讨论服务器方案。在多个HTTP请求或Web服务调用之间简单地共享单个实体会使您的应用程序无用。任何请求都只能触发SaveChanges
并保存来自另一个请求的部分数据,因为您要在所有请求之间共享一个工作单元。这也将带来另一个问题-上下文,对上下文中的实体或上下文使用的数据库连接进行的任何操作都不是线程安全的。
即使对于只读应用程序,全局上下文也不是一个好选择,因为每次查询应用程序时您可能都希望有新数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句