Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 在实体框架中保存一个,保存所有_Entity Framework_Design Patterns_Mvvm - Fatal编程技术网

Entity framework 在实体框架中保存一个,保存所有

Entity framework 在实体框架中保存一个,保存所有,entity-framework,design-patterns,mvvm,Entity Framework,Design Patterns,Mvvm,我仍在学习工作单元模式、存储库模式等 我的应用程序: 我有一个实体列表,比如listview中的客户 当我选择一个客户时,会显示一个详细信息表单,可以在其中编辑他们的详细信息 我试图理解实现以下目标的标准MVVM/实体框架方法: 当用户编辑客户时,它显示为“已更改”(但未保存) 用户可以选择保存当前客户或保存所有更改的客户 如果该选项不可用(当前客户未更改或所有客户未更改),则“保存”或“保存所有命令/按钮”将被禁用 看起来很简单?但我不知道如何使用MVVM/EF实现这一点。我是否使用U

我仍在学习工作单元模式、存储库模式等

我的应用程序:

  • 我有一个实体列表,比如listview中的客户
  • 当我选择一个客户时,会显示一个详细信息表单,可以在其中编辑他们的详细信息
我试图理解实现以下目标的标准MVVM/实体框架方法:

  • 当用户编辑客户时,它显示为“已更改”(但未保存)
  • 用户可以选择保存当前客户或保存所有更改的客户
  • 如果该选项不可用(当前客户未更改或所有客户未更改),则“保存”或“保存所有命令/按钮”将被禁用
看起来很简单?但我不知道如何使用MVVM/EF实现这一点。我是否使用UoW,是否分离对象并重新附加到上下文,以便一次保存一个对象?如何检测对象是否已更改或未更改


救命啊!谢谢

我想说几句话:

在我看来,您的需求中的关键点是选择保存单个客户或所有更改的客户。您需要考虑到实体框架没有一种方法来保存上下文中单个或几个选定对象的更改。您只能通过调用
myContext.SaveChanges()
来保存整个工作单元的更改(即EF中的
ObjectContext
DbContext

由此得出结论,您不能在一个工作单元(=EF上下文)中使用所有客户列表和客户详细信息表单,该工作单元将所有客户作为附加实体。如果您愿意这样做,您可以提供一个功能/按钮来保存所有更改,但不能提供仅在表单中保存当前客户的选项

所以,我要么考虑你是否真的需要这些函数,要么在分离状态下处理实体。这意味着您必须从数据库中加载客户列表,然后处理上下文。当您保存更改时(现在不管是所有更改还是仅一个客户的更改),您可以创建一个新上下文,从数据库中提取原始实体,并使用更改的属性进行更新

但在我看来,使用附加或分离的实体,或者每个视图/表单有一个活动EF上下文,或者每个CRUD操作只创建一个短的活动上下文,是一个重要的设计决策。通常,在视图/表单的生命周期内,可以将实体附加到上下文,以使您作为程序员的生活更轻松,因为它为您提供了延迟加载和即时更改跟踪等功能。所以如果你想放弃,你可能会三思而后行

要识别客户对象是否已更改,EF上下文可能会有所帮助,因为它跟踪对象的状态。例如,您可以为客户查询ObjectStateManager,并检查其是否处于“已更改”状态。但要使用此选项,您需要使用上面解释的附加实体。由于无法保存(或同时取消)单个对象更改,因此向用户显示客户1和客户3已更改是否有意义值得怀疑。(我可能只会显示“一些客户已经改变了”。)

如果您使用的是分离的实体,那么您必须通过实现某种“脏标志”逻辑来手动管理哪些客户已更改或未更改。以下是一条关于此的线索:


谢谢。我还需要跟踪EF之外更改的属性,因此我已经设法通过处理objects PropertyChanged事件为每个对象手动创建“changed”属性。