2011-04-14 36 views
2

我还在学习有关的工作模式,仓库图案单位等保存一,全部保存在实体框架

我的应用程序:

  • 我有实体的名单,说客户一个列表视图
  • 当我选择客户详细信息表单显示,在那里他们的详细资料可以被编辑

我想了解办成跟随着标准MVVM /实体框架的方式G:

  • 当用户编辑一个客户它显示为“改变”(但不保存)
  • 可以选择要么保存当前客户,或保存所有更改的客户用户
  • 另存或保存所有命令/按钮被禁用,如果该选项不可用(当前客户不变,或所有客户不变)

似乎够简单吗?但我不知道如何使用MVVM/EF来解决这个问题。我是否使用UoW,是否分离对象并重新连接到上下文,以便一次只能保存一个对象?如何检测对象是否更改或未更改?

帮助!谢谢!

回答

4

我扔在一个几句话:

的临界点在您的要求在我看来,以节省任何一个单一客户或全部改变客户的选项。您需要考虑到实体框架没有方法来保存上下文中单个或少数选定对象的更改。您只能通过致电myContext.SaveChanges()来保存整个工作单元(其中的ObjectContextDbContext在EF中)的更改。

这导致您不能使用所有客户名单及工作(= EF上下文)的一个单独的单元,保持一切以客户为连接实体客户详细形式的结论。如果你这样做,你可以提供一个功能/按钮来保存的所有更改,但不能保存表格中当前客户的选项。

所以,我会考虑如果你真的需要这些功能,或者我会与处于分离状态的实体一起工作。这意味着您必须从数据库加载客户列表并在此之后处理上下文。当您保存更改时 - 现在无论是单个客户的所有更改还是仅更改都无关紧要 - 您可以创建新的上下文,从数据库中提取原始实体/实体并使用更改的属性进行更新。

但随着要么安装或拆卸实体工作 - 或者按次/形式既可以采用具有一个活EF上下文或只创建一个短版活每CRUD操作语境 - 在我看来是一个重要的设计决定。一般来说,在视图/表单的生命周期中将您的实体附加到上下文中的可能性使您的程序员更容易,因为它为您提供了延迟加载和更改开箱即用功能等功能。所以如果你想放弃这一点,你可能会三思而后行。

要识别客户对象是否已更改,EF上下文可能会有帮助,因为它跟踪对象的状态。您可以为客户查询ObjectStateManager并检查它是否处于“已更改”状态。但是要有这个选项,你需要像上面解释的那样与附属实体一起工作。由于您无法保存(或取消)单个对象更改,所以向用户显示客户1和客户3已更改是否有意义是有问题的。 (我可能只会显示“某些客户已经改变”)。

如果您正在使用分离的实体,则必须通过实施某种“脏标志”逻辑手动管理哪些客户已更改或未更改。这里有一个关于此的线程:

Different ways to implement 'dirty'-flag functionality

+0

谢谢。我还需要跟踪EF以外的已更改属性,所以我设法通过处理对象PropertyChanged事件手动为每个对象创建“已更改”属性。 – DaveO 2011-04-15 05:18:03