gpt4 book ai didi

.net - WinForm绑定(bind)场景中的Datacontext Lifetime

转载 作者:行者123 更新时间:2023-12-03 21:38:49 25 4
gpt4 key购买 nike

这个问题困扰了我一段时间。但我不是专家。这个有点长。。。

我有一个带有 Outlook 样式 UI 的 WinForms 应用程序。也就是说,左侧 Pane 中有一个栏,允许您选择一个“屏幕”,它是一个 WinForms 控件,例如客户屏幕,在右侧 Pane 中将出现一个客户列表(即客户控制)。我称之为资源管理器界面。双击记录将在附加窗口中显示非模态客户记录,就像您在 Outlook 中打开电子邮件一样,我们称之为检查员。如果您双击多条记录,您将获得多个检查员。

整个事情是使用数据绑定(bind)完成的。客户列表控件上有一个 BindingSource 控件,客户检查器上有另一个。客户控件在其加载事件中更新静态 DataContext,并将简单 Linq-To-SQL 查询的结果分配给 BindingControl 数据源属性。双击客户列表时,事件查找记录,将其转换为 Linq-To-SQL 客户对象,并将其提供给客户检查器表单的构造函数。客户检查器获取客户对象并将其 BindingSource 控件的数据源属性分配给它。

由于 BindingSource 控件支持 IBindingList,因此在调用 EndEdit 之前,不会修改客户对象的内容,在此应用程序中,当单击 OK 按钮时。由于 Linq to SQL 实现了 INotifyPropertyChanged 接口(interface),因此客户列表将被更新。凉爽的。

但是,当我想刷新客户列表的内容以获取其他用户所做的更改时,问题就来了,我希望每隔 60 秒定期发生一次。如果我有一个计时器并在同一个数据上下文上重新运行查询,则不会获取任何更改,因为 Linq to SQL 不想压缩在数据上下文控制下对数据所做的任何更改。奇怪的是,它对数据库运行查询,但身份跟踪意味着只有从数据库返回的新客户对象才会添加到列表中。如果我新建了另一个数据上下文,那么任何开放的客户检查员都不再使用相同的数据上下文,因此 future 对开放客户检查员的任何更改都不会反射(reflect)在客户列表中。

基本上数据是陈旧的,因为我没有使用工作单元模式。所以(如果你还和我在一起),问题是。

1. 在这种情况下,我到底如何让工作单元模式工作? ASP.NET 使用请求范围的数据上下文很容易,它的生命周期很短,但是在 WinForms 中呢?

2. 在这种情况下,还有其他的 ORM 会更好吗? NHibernate、EF、LLBLGEN 等

3. 我还应该怎么做?

并且。

4. 如果我可以让 Linq to SQL 像这样工作,是否有人在 Linq to SQL 部分类中实现了 IBindingList,这将避免我不得不使用 IBindingSource 控件。 (我不确定我应该关心这个)。

5. 如果我可以让 Linq to SQL 像这样工作,有什么方法可以在 SQL 2008 中使用 SQL 通知,以便在底层查询结果发生更改时通知我并重新查询,而不是轮询。

谢谢!

附言我知道我可以使用

db.Refresh(System.Data.Linq.RefreshMode.KeepChanges, customers)

但这会导致针对列表中每个客户记录的数据库运行查询。

最佳答案

我将重申你的问题,以确保我已经理解它。

您有一个显示实体列表(列表)的小部件。当您单击 LIST 中的项目时,会出现另一个小部件,允许用户编辑实体。当用户完成对实体的编辑后,他们的更改将提交到数据库,并且也应该反射(reflect)在实体列表中。系统还应定期获取其他用户对 LIST 中的项目所做的更改并更新 LIST。

如果这是正确的,我将抛开两个用户编辑同一个实体的任何并发问题,因为这似乎不是您关心的问题,并将重点关注如何组织 UI 和工作单元。

您需要将 LIST 中的实体与检查员正在编辑的实体分开。检查员代表的业务流程是您的工作单元,每个实体一个单元。您的列表不代表一个工作单元。它是所有先前提交的工作单元的组合工作的陈旧表示或时间点。您的 LIST 甚至不必直接处理您的实体,它可以保存一个 ID 或任何其他方式,以便您的检查员在用户单击它时从数据库中获取基础实体。现在,您可以随时更新列表,因为您的检查员根本不与它共享实例。

为了向您的用户模拟,当他们通过检查器编辑实体并使它们看起来绑定(bind)到同一事物时,您有两个选择。

1)列表只绑定(bind)到数据库中的已提交数据。这很容易,当检查员将本地更改刷新回数据库并成功提交时,为检查员提供了一种告诉列表进行自我更新的方法。

2)列表绑定(bind)到已提交数据+本地未提交数据。这有点困难,您需要在列表中公开方法,这些方法允许检查员胜过从 Db 返回的数据,并用自己的本地脏数据覆盖它。

关于.net - WinForm绑定(bind)场景中的Datacontext Lifetime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/381017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com