我还在学习工作单元模式,存储库模式等。
我的应用:
我正在尝试理解标准的MVVM / Entity Framework实现以下方法:
看起来够简单?但我不知道如何使用MVVM / EF来解决这个问题。我是否使用UoW,是否要分离对象并重新连接到上下文,以便我可以一次保存一个?如何检测对象是否更改或未更改?
帮助!谢谢!
答案 0 :(得分:4)
我提出几点意见:
在我看来,您的要求中的关键点是保存单个客户或所有已更改客户的选项。您需要考虑到Entity Framework没有方法来保存上下文中单个或几个选定对象的更改。您只能通过调用ObjectContext
来保存整个工作单元(EF中的DbContext
或myContext.SaveChanges()
)的更改。
这导致得出的结论是,您不能在一个工作单元(= EF上下文)中使用所有客户的列表和客户详细信息表单,该单元将所有客户作为附加实体。如果您这样做,您可以提供一个功能/按钮来保存所有更改,但不能选择只保存表单中的当前客户。
所以,我会考虑你是否真的需要这些功能,或者我会处理处于分离状态的实体。这意味着您必须从数据库加载客户列表并在此之后处置上下文。保存更改时 - 现在无论是所有更改还是仅更改单个客户 - 都可以创建新上下文,从数据库中提取原始实体/实体并使用更改的属性进行更新。
但是在我看来,使用附加或分离的实体 - 或者每个视图/表单都有一个活动的EF上下文或者每个CRUD操作只创建一个短生存环境 - 是一个重要的设计决策。通常,在视图/表单的生命周期中将实体附加到上下文的可能性使您的程序员生活变得更容易,因为它为您提供了延迟加载和开箱即用的更改跟踪等功能。如果你想放弃它,你可能会三思而后行。
要识别客户对象是否已更改,EF上下文可能会有所帮助,因为它跟踪对象的状态。例如,您可以查询客户的ObjectStateManager并检查它是否处于“已更改”状态。但是要使用此选项,您需要使用附加实体,如上所述。由于您无法保存(或取消)单个对象更改,因此向用户显示客户1和客户3已更改是否有意义是有意义的。 (我可能只会说“有些客户已经改变了”。)
如果您正在使用分离的实体,则必须通过实现某种“脏标志”逻辑手动管理客户已更改的内容。这是一个关于这个的主题: