【问题标题】:从两个上下文实例实体框架中使用一个实体
【发布时间】:2022-01-20 12:27:06
【问题描述】:

我为每个表单创建上下文实例,并且多个表单可能使用相同的实体 保存时如何处理?

【问题讨论】:

  • 定义“处理这个”并阅读How to Ask 并展示您尝试过的内容。您的意思是您在同一个实体上打开了两个表格,最后一个保存的表格获胜?阅读有关并发性的内容并决定如果另一个表单编辑了一个实体你想做什么:docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/…,即使这是关于 MVC,同样的原则也适用。
  • 为什么不为每个应用使用上下文实例?
  • 每个应用一个实例可能会加载拥抱实体跟踪器
  • @Sergey 因为它是 WinForms,它可能运行数小时甚至数天?对于 DbContext 来说,这不是一个好的生命周期。
  • @codecaster 如果我使用两个实例上下文中的相同实体,当更改状态返回错误时

标签: c# winforms entity-framework


【解决方案1】:

DbContext 是您的“视图状态”的一部分,旨在让您访问数据库,在更改跟踪器中保存用户正在处理的数据的副本,并将更改刷新回数据库。

在智能客户端应用程序中,DbContext 的自然范围和生存期要么是全局的,要么是限定为代表任务或用例的 UI 元素。但在任何一种情况下,您都必须防止 DbContext 的更改跟踪器变得过大或保留数据副本的时间过长,因为即使是单个表单也可能整天保持打开状态。这些应用程序的一个可能的经验法则是在每次成功的 SaveChanges() 之后清除更改跟踪器。除此之外,当然您必须避免长时间运行的事务,以便 DbContext 不会长时间保持 DbConnection 打开,但无论如何您都必须这样做。关键是带有空更改跟踪器的 DbContext 可以长期存在。

使用 Short-Lived DbContext 是可能的,但是您失去了 Change Tracker 和 .Local ObservableCollection 的服务,这使得数据绑定变得非常容易。所以这不是灵丹妙药。

接着手头的问题,如果你有 DbContext-per-form,并且你有实体的窗体到窗体通信,最终被不同的 DbContext 保存,你真的别无选择,只能断开连接在发送它们之前从它们的主 DbContext 中获取实体。

或者这可能表明两个表单确实应该共享一个视图状态,并且您应该创建一个包含 DbContext 和实体的显式视图状态对象,并在表单之间共享。

查看Model-View-ViewModel (MVVM) 模式,该模式引入了 View(表单)和 ViewModel 之间的区别,ViewModel 是对用例用户与应用交互进行建模的数据。这是一种有用的模式,在基于 XAML 的智能客户端中得到了广泛应用。此外,XAML(仍然)是智能客户端应用程序中的future,因此学习它很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多