Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF应用程序中的全局实体框架上下文 我在使用实体框架(.NET 3.5)的WPF应用程序的开发中。它访问整个系统中多个位置的实体。我担心整个应用程序在实体方面的一致性。我应该在不同的视图中实例化不同的上下文,还是应该(这是一个很好的方法)实例化一个可以全局访问的单个上下文_Wpf_Vb.net_Entity Framework - Fatal编程技术网

WPF应用程序中的全局实体框架上下文 我在使用实体框架(.NET 3.5)的WPF应用程序的开发中。它访问整个系统中多个位置的实体。我担心整个应用程序在实体方面的一致性。我应该在不同的视图中实例化不同的上下文,还是应该(这是一个很好的方法)实例化一个可以全局访问的单个上下文

WPF应用程序中的全局实体框架上下文 我在使用实体框架(.NET 3.5)的WPF应用程序的开发中。它访问整个系统中多个位置的实体。我担心整个应用程序在实体方面的一致性。我应该在不同的视图中实例化不同的上下文,还是应该(这是一个很好的方法)实例化一个可以全局访问的单个上下文,wpf,vb.net,entity-framework,Wpf,Vb.net,Entity Framework,例如,我的实体模型有三个部分:发货(包含子包和更多子内容)、公司/联系人(包含子地址和电话)和磁盘规格。装运和编辑装运视图访问磁盘规格,选项视图管理磁盘规格(创建、编辑、删除)。如果我编辑一个DiskSpec,我必须在ShipmentsView中有一些东西来检索最新的规范,如果我有单独的上下文,对吗 如果有一个整体上下文,应用程序的其余部分从中检索其对象是安全的,那么我想这就是正确的选择。如果是这样的话,这个例子会放在哪里?我正在使用VB.NET,但我可以从C#翻译,非常好。任何帮助都将不胜感激

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

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

我只是不希望有这样的应用程序,用户必须在应用程序的不同部分点击“重新加载”十几次才能获得新数据

更新:

好的,我将我的应用程序更改如下:

  • 所有上下文都是在不再需要块后使用块来处理它们时创建的
  • 加载时,在释放上下文之前,将从上下文中删除所有实体
  • MainViewModel(ContextUpdated)中的一个新属性引发一个事件,所有其他ViewModels都订阅该事件,运行该ViewModels RefreshEntities方法
  • 在实现这一点之后,我开始收到错误消息,说一个实体一次只能被一个ChangeTracker引用。由于我无法确定哪个上下文仍在引用实体(不应该是任何上下文对吗?),我将对象强制转换为IEntityWithChangeTracker,并将SetChangeTracker设置为nothing(Null)
  • 这就让我们看到了当前的问题: 当我将实体上的changeTracker设置为Null,然后将其附加到上下文时,它将丢失其已更改的状态,并且不会更新到数据库。但是,如果我不将更改跟踪器设为空,则无法附加。我有自己的变更跟踪代码,所以这不是问题


    我的新问题是,你该怎么做。一个很好的实体查询和实体保存代码截取的例子将有很大的帮助,因为我正在绞尽脑汁试图让我曾经认为是一个简单的事务正常工作

    好问题,科里。从我这里抬起大拇指

    实体框架为您提供了一个自由选择—您可以实例化多个上下文,也可以只有一个静态上下文。它在两种情况下都能很好地工作,是的,两种解决方案都是安全的。我能给你的唯一有价值的建议是:尝试两者,衡量性能、延迟等,然后为你选择最好的一个。相信我,这很有趣:)

    如果这将是一个具有大量并发连接的大型应用程序,我建议使用一个静态上下文或一个静态核心上下文,并且仅使用少量附加上下文来支持主上下文。但是,正如我在上面只写了几行一样,哪种解决方案更适合您取决于您的需求

    我特别喜欢你问题的这一部分:

    我只是不想要那种 用户必须点击的应用程序 以不同的方式重新加载十几次 获取新数据的部分应用程序

    WPF是一个非常非常强大的工具,用户必须按下按钮刷新数据的时间基本上已经一去不复返了。WPF为您提供了非常广泛的异步多线程工具,如Dispatcher类或后台工作程序,用于在后台温和地刷新所需的数据。这真的很棒,因为不仅您不必担心按下各种按钮,而且后台线程也不会阻塞UI,所以从用户的角度来看数据是透明的


    WPF和实体框架确实值得学习——请随时询问您是否还有其他问题。

    全局静态上下文很少是正确的答案。考虑数据库在执行此应用程序时被重置会发生什么情况-您的SQL连接已经消失,使用静态上下文的所有后续请求都将失败。 建议您找到一种缩短实体上下文生命周期的方法—打开它,做一些工作,处理它

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

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


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

    好的,那么如果我使用多个上下文,一个上下文如何知道刷新它提取的数据。我会让它监视另一个上下文设置的propertychanged事件吗?当应用程序处于空闲状态时,上下文应该关闭并消失。您所拥有的只是处于此状态的DTO或已解除跟踪的实体。当有人单击某个对象时,请打开单个上下文,重新附加实体或重新加载实体并从UI应用更改,然后调用savechanges处理它可能引发的任何乐观并发异常,然后更新视图并最终处理上下文。将上下文视为单个工作单元的边界。这代表了我如何看待EFs功能的根本性变化。我被打动了