让我们举一个WinForms applcation和发票的例子。在发票表单上,我们检索产品列表,因此用户可以选择当前发票的产品。还可以考虑在此过程中,用户意识到他需要在将产品放入发票之前将新产品(或编辑当前产品)添加到ProductList。因此,他打开了一个ProductForm,其中所有产品都被重新检索(再次)。 它也可能是相反的顺序,即用户首先编辑产品,然后在不关闭产品表单的情况下打开新的发票。原则是数据加载了两倍,实际上是相同的数据。
处理这种情况的方法是什么,所以我们可以告诉一个表单数据已经加载,并从内存中检索数据?当数据的所有消费者(表格)都关闭时,那么数据也应该从内存中释放出来?或者我的方向错误,还有更好的方法吗?
谢谢, 戈兰
答案 0 :(得分:1)
如果使用数据的控件都是共享父控件的子控件,那么您可以传递datacontext,以便它们共享相同的datacontext。
但是,数据库的一般用例(在大多数情况下支持EF)是每次需要时读取数据。
如果你说你已经在一个表单中使用了该项目,那么解决这个问题的方法就是将该项目的参考文献添加到新表单中。
因此,如果您的发票上有产品清单,并且您想要添加到产品清单,则可以将产品清单从发票传递到开仓产品清单。
这有一些问题:
但是,除非是真正的性能问题,否则我每次都会加载数据。您可以使用存储库模式对此进行大量简化,因此您只需调用一个方法即可获得产品列表或发票,或者您需要的任何数据部分。
答案 1 :(得分:1)
Definitelly将数据加载“两次”或者你会引入更糟糕的问题。
共享数据意味着共享ObjectContext。即使在WinForms应用程序中,这也被视为糟糕的方法。检查this article(它与NHibernate有关,但描述对EF也有效)。
问题是ObjectContext是工作单元。如果在两个窗口之间共享上下文,您可以轻松进入在第一个窗口中修改数据的情况(不保存它们!),然后在第二个窗口中继续按下保存按钮,但它将保存两个窗口中的数据!共享上下文时,不能有选择地仅从一个窗口保存数据。