WPF应用程序中的全局实体框架上下文

Cod*_*ior 8 vb.net wpf entity-framework

我正在开发使用Entity Framework(.NET 3.5)的WPF应用程序.它访问整个地方的实体.我担心整个应用程序在实体方面的一致性.我应该在不同的视图中实例化单独的上下文,还是应该(并且这是一个很好的方法)实例可以全局访问的单个上下文?

例如,我的实体模型有三个部分:发货(带有子包和更多子内容),公司/联系人(带有子地址和电话)和磁盘规格.Shipments和EditShipment视图访问DiskSpecs,OptionsView管理DiskSpecs(创建,编辑,删除).如果我编辑DiskSpec,如果我有单独的上下文,我必须在ShipmentsView中有一些东西来检索最新的规格吗?

如果有一个整体上下文可以安全地从应用程序的其余部分检索它的对象,那么我想这是要走的路.如果是这样,该实例将放在哪里?我正在使用VB.NET,但我可以从C#翻译得相当不错.任何帮助,将不胜感激.

我只是不希望其中一个应用程序用户必须在应用程序的不同部分重新加载十几次来获取新数据.

更新:

好的,所以我更改了我的应用程序如下:

  1. 所有上下文都是在使用块中创建的,以便在不再需要它们之后将其处理掉.
  2. 加载后,所有实体在处置之前都会从上下文中分离出来.
  3. MainViewModel(ContextUpdated)中的新属性引发一个事件,所有其他ViewModel都订阅了哪个ViewModels RefreshEntities方法.
  4. 实现之后,我开始收到错误,说实体一次只能被一个ChangeTracker引用.由于我无法确定哪个上下文仍然引用实体(不应该是任何上下文对吗?)我将对象转换为IEntityWithChangeTracker,并将SetChangeTracker设置为空(Null).

这让我们解决了当前的问题:当我在实体上对changeTracker进行Null,然后将其附加到上下文时,它会丢失它的已更改状态并且不会更新到数据库.但是,如果我没有使更改跟踪器为空,我无法附加.我有自己的更改跟踪代码,所以这不是问题.

我的新问题是,你应该怎么做呢.一个很好的例子实体查询和实体保存代码剪切会有很长的路要走,因为我试图得到我曾经认为是一个简单的交易工作.

Ian*_*cer 6

全局静态上下文很少是正确的答案.试想,如果数据库此应用程序的执行过程中重新发生了什么 - 你的SQL连接已逝,使用静态上下文将拒绝以后的所有请求.

建议您找到一种方法,让您的实体上下文的生命周期缩短 - 打开它,做一些工作,处理它,......

至于把你的不同对象在同一EDMX,那几乎可以肯定是正确的答案,如果他们有对象之间的任何关系,你会希望他们在同一个EDMX.

至于重新加载 - 用户永远不必这样做.在幕后,您可以打开一个新的上下文,从数据库重新加载对象的当前版本,应用他们在UI中所做的更改,然后将其保存回来.

您可能还希望查看分离的实体,并在尝试保存更改并且其他人更改了数据库中的同一对象时,请注意乐观并发异常.