wpf - WPF 应用程序中的全局 Entity Framework 上下文

标签 wpf vb.net entity-framework

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

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

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

我只是不希望用户必须在应用程序的不同部分重新加载十几次才能获取新数据的应用程序之一。

更新:

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

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

  • 这导致了当前的问题:
    当我将实体上的 changeTracker 设为 Null,然后将其附加到上下文时,它会丢失其更改状态并且不会更新到数据库。但是,如果我不将更改跟踪器设为空,则无法附加。我有自己的更改跟踪代码,所以这不是问题。

    我的新问题是,你应该怎么做。一个很好的示例实体查询和实体保存代码剪断将有很长的路要走,因为我正在努力使我曾经认为是一个简单的事务工作。

    最佳答案

    全局静态上下文很少是正确的答案。考虑一下如果在此应用程序执行期间重置数据库会发生什么情况 - 您的 SQL 连接消失了,所有使用静态上下文的后续请求都将失败。

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

    至于将不同的对象放在同一个 EDMX 中,如果它们在您希望它们在同一个 EDMX 中的对象之间存在任何关系,那么这几乎肯定是正确的答案。

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

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

    关于wpf - WPF 应用程序中的全局 Entity Framework 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2878042/

    相关文章:

    entity-framework - 使用 Entity Framework 将数据表数据插入数据库?

    c# - EF 7 : How to load related entities in a One-to-many relationship

    .net - 拖放示例?

    arrays - VB.NET 检查现有文件并为该名称分配新的版本号?

    vb.net - 检测互联网是否已连接

    mysql - 如何将bak文件转换成sql文件(支持sql bak文件转mysql)并执行该文件自动恢复

    c# - EF 异常 - InvalidOperationException : The 'x' property on 'y' could not be set to a 'String' value

    c# - 使用正则表达式从 html 中获取字符串

    wpf - 使用控件模板创建图像+文本按钮?

    wpf - 如何在 WPF 中将组合框的样式更改为标签或超链接?