我正在开发使用 Entity Framework (.NET 3.5) 的 WPF 应用程序。它在多个地方访问实体。我担心整个应用程序中实体的一致性。我应该在我的不同 View 中实例化单独的上下文,还是应该(并且是一个很好的方法)实例化一个可以全局访问的单个上下文?
例如,我的实体模型包含三个部分:货件(带有子包裹和更多子内容)、公司/联系人(带有子地址和电话)和磁盘规范。 Shipments 和 EditShipment View 访问 DiskSpecs,OptionsView 管理 DiskSpecs(创建、编辑、删除)。如果我编辑 DiskSpec,如果我有单独的上下文,我必须在 ShipmentsView 中有一些东西来检索最新的规范,对吗?
如果有一个整体上下文是安全的,应用程序的其余部分可以从中检索它的对象,那么我想这就是要走的路。如果是这样,那个实例会放在哪里?我正在使用 VB.NET,但我可以很好地从 C# 翻译。任何帮助,将不胜感激。
我只是不希望用户必须在应用程序的不同部分重新加载十几次才能获取新数据的应用程序之一。
更新:
好的,所以我改变了我的应用程序如下:
这导致了当前的问题:
当我将实体上的 changeTracker 设为 Null,然后将其附加到上下文时,它会丢失其更改状态并且不会更新到数据库。但是,如果我不将更改跟踪器设为空,则无法附加。我有自己的更改跟踪代码,所以这不是问题。
我的新问题是,你应该怎么做。一个很好的示例实体查询和实体保存代码剪断将有很长的路要走,因为我正在努力使我曾经认为是一个简单的事务工作。
最佳答案
全局静态上下文很少是正确的答案。考虑一下如果在此应用程序执行期间重置数据库会发生什么情况 - 您的 SQL 连接消失了,所有使用静态上下文的后续请求都将失败。
建议您找到一种方法来缩短实体上下文的生命周期 - 打开它,做一些工作,处理它,......
至于将不同的对象放在同一个 EDMX 中,如果它们在您希望它们在同一个 EDMX 中的对象之间存在任何关系,那么这几乎肯定是正确的答案。
至于重新加载 - 用户永远不必这样做。在幕后,您可以打开一个新的上下文,从数据库重新加载对象的当前版本,应用他们在 UI 中所做的更改,然后将其保存回来。
您可能还想查看分离的实体,并在您尝试保存更改并且其他人更改了数据库中的同一对象时注意乐观并发异常。
关于wpf - WPF 应用程序中的全局 Entity Framework 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2878042/