.net WinForm绑定场景中的Datacontext生存期

.net WinForm绑定场景中的Datacontext生存期,.net,winforms,linq-to-sql,data-binding,.net,Winforms,Linq To Sql,Data Binding,这个问题困扰了我一段时间。但我不是专家。这有点长 我有一个带有Outlook风格UI的WinForms应用程序。这意味着在左侧窗格上有一个栏,允许您选择WinForms控件的“屏幕”,比如客户屏幕,在右侧窗格上会出现客户列表(即客户控件)。我称之为浏览器界面。双击记录将在另一个窗口中显示非模式客户记录,就像在Outlook中打开电子邮件一样,我们称之为检查器。如果双击多个记录,则会得到多个检查员 整个过程都是使用数据绑定完成的。customer list控件上有一个BindingSource控件

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

我有一个带有Outlook风格UI的WinForms应用程序。这意味着在左侧窗格上有一个栏,允许您选择WinForms控件的“屏幕”,比如客户屏幕,在右侧窗格上会出现客户列表(即客户控件)。我称之为浏览器界面。双击记录将在另一个窗口中显示非模式客户记录,就像在Outlook中打开电子邮件一样,我们称之为检查器。如果双击多个记录,则会得到多个检查员

整个过程都是使用数据绑定完成的。customer list控件上有一个BindingSource控件,customer inspector上有另一个。客户控件在其load事件中更新静态DataContext,并将简单的Linq To SQL查询的结果分配给BindingControl数据源属性。双击客户列表时,事件将查找记录,将其强制转换为Linq to SQL客户对象,并将其提供给customer inspector表单的构造函数。customer inspector获取customer对象并将其BindingSource控件的datasource属性分配给它

由于BindingSource控件支持IBindingList,因此在该应用程序中单击“确定”按钮时,在调用EndEdit之前,不会修改客户对象的内容。由于Linq to SQL实现了INotifyPropertyChanged接口,因此客户列表将随之更新。酷

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

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

1。在这种情况下,我该如何让工作单元模式工作?ASP.NET很容易使用请求范围的datacontext,它的寿命很短,但在WinForms中?

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

3。我还应该怎么做呢?

还有

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

5。如果我能让Linq to SQL像这样工作,有没有办法在SQL 2008中使用SQL通知,以便在基础查询结果更改时通知我,然后重新查询,而不是轮询。

谢谢

另外,我知道我可以使用

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

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

我目前正在尝试在WinForms SmartClient应用程序中实现相同的方案

你找到一个很好的解决办法了吗

在我们的应用程序中,我们有相同的并发UI需求,并且需要从共享源刷新数据,但是我们使用的是WCF服务,而不是LinqToSql。我已经实现了我们自己的身份映射和变更跟踪解决方案

显然,在inspector中对客户所做的更改反映在其他视图中是很重要的。但是,这种方式给用户的印象是,他们的更改已经保存

我会围绕工作单元画一条线,从阅读客户列表开始,到保存用户的更改结束。如果您重新阅读客户列表,但没有任何更改,则这是一个新的工作单元。如果有更改,则需要关闭并保存用户所做的更改,然后才能开始新的工作单元

我们的问题是,我们一次打开了许多窗口,用户很容易进行一些编辑而不将其提交到后端。那么他们为什么不能重新加载主列表就不明显了

我们决定在这种情况下,我们应该自动保存用户的更改


你有没有想出更好的解决办法

也许有点老了。。。但关于第4/5点,请务必查看CodePlex上的Bindable LINQ项目。肯定有一些很好的代码可以解决你的问题

@Andronicus

在研究了几十种ORMA之后,我目前正在研究一种叫做Genome()的商业ORM

我似乎允许我做更多的上述工作,比如更高级的数据绑定,并且可以阻止记录过时,但我仍然在寻找解决方法。我会让你知道我的进展,但我可能会在某个时候

@雷多格

我看着BindableLinq,我真的很喜欢它。但它是Linq到对象,因此据我所知,它没有Linq到SQL的转换。(除非我错了)


非常感谢

我也试过类似的方法,这是我的两分钱

我认为您不能在这里实现工作单元模式,因为UI的工作方式。正如您可能已经知道的,LinqToSql DataContext被设计为一个轻量级的短生命对象。它自然地绑定到一个“工作单元”。在您的情况下,将更改提交到DB是一个单元,从DB刷新更改是另一个单元。但是您需要一个数据上下文