检索不同表单上的公共数据

时间:2011-03-03 13:50:16

标签: winforms entity-framework

让我们举一个WinForms applcation和发票的例子。在发票表单上,我们检索产品列表,因此用户可以选择当前发票的产品。还可以考虑在此过程中,用户意识到他需要在将产品放入发票之前将新产品(或编辑当前产品)添加到ProductList。因此,他打开了一个ProductForm,其中所有产品都被重新检索(再次)。 它也可能是相反的顺序,即用户首先编辑产品,然后在不关闭产品表单的情况下打开新的发票。原则是数据加载了两倍,实际上是相同的数据。

处理这种情况的方法是什么,所以我们可以告诉一个表单数据已经加载,并从内存中检索数据?当数据的所有消费者(表格)都关闭时,那么数据也应该从内存中释放出来?或者我的方向错误,还有更好的方法吗?

谢谢, 戈兰

2 个答案:

答案 0 :(得分:1)

如果使用数据的控件都是共享父控件的子控件,那么您可以传递datacontext,以便它们共享相同的datacontext。

但是,数据库的一般用例(在大多数情况下支持EF)是每次需要时读取数据。

如果你说你已经在一个表单中使用了该项目,那么解决这个问题的方法就是将该项目的参考文献添加到新表单中。

因此,如果您的发票上有产品清单,并且您想要添加到产品清单,则可以将产品清单从发票传递到开仓产品清单。

这有一些问题:

  • 如果另一个用户在打开数据源时更改了数据源(a.k.a。并发)
  • 处理保存不会保存他们可能在一个他们实际上不想添加到数据中的区域进行更改的情况。

但是,除非是真正的性能问题,否则我每次都会加载数据。您可以使用存储库模式对此进行大量简化,因此您只需调用一个方法即可获得产品列表或发票,或者您需要的任何数据部分。

答案 1 :(得分:1)

Definitelly将数据加载“两次”或者你会引入更糟糕的问题。

共享数据意味着共享ObjectContext。即使在WinForms应用程序中,这也被视为糟糕的方法。检查this article(它与NHibernate有关,但描述对EF也有效)。

问题是ObjectContext是工作单元。如果在两个窗口之间共享上下文,您可以轻松进入在第一个窗口中修改数据的情况(不保存它们!),然后在第二个窗口中继续按下保存按钮,但它将保存两个窗口中的数据!共享上下文时,不能有选择地仅从一个窗口保存数据。