允许选择实体使用LINQ to SQL保存在分页WPF MVVM应用程序中

时间:2011-05-06 10:27:12

标签: wpf linq-to-sql mvvm commit

我正在开发一个允许编辑SQL Server数据库的应用程序。我遇到的问题是允许用户保存一些更改但丢弃其他一些更改。我希望能就我的设计提出一些建议。

该应用程序是MVVM。作为Model I,我使用LINQ to SQL类。通常,我为每个实体类都有ViewModel类。然后,我为每个实体实例

创建一个ViewModel实例

接口由一个窗口组成,我在其中切换Views以实现分页系统。在大多数情况下,实体,视图模型,视图和页面之间存在1:1的关系。

我遇到的问题最好通过以下示例进行描述:

考虑以下表格:

  • 服务
  • StaffMembers
  • StaffMemberAssignments

我有一个实体,服务。它在数据库中由Services表中的一行表示,并具有诸如“Name”,“ContractValue”和“Type”之类的参数。 每个服务还包含StaffMemberAssignments列表。 StaffMemberAssignments存储在它们自己的表中,包含一些有关分配的参数,以及两个外键 - 一个分配给它们的服务,一个分配给StaffMember表,分配给正在分配的StaffMember。

总结:
服务 - StaffMemberAssignment - StaffMember

编辑服务后(在ServiceView上,使用基于单个服务实例的ServiceViewModel),用户可以“保存更改”或“取消”。 “保存更改”命令将对LINQ to SQL datacontext的所有更改提交到数据库。取消将服务对象恢复到其原始状态。

用户可以将StaffMembers添加到服务 - 这将创建StaffMemberAssignments以将StaffMember链接到服务。

这是棘手的部分
如果用户想要将StaffMember添加到服务,则会打开StaffMembersListView(它是一个具有选择选项的表)。此视图将ServiceView替换为当前页面。选择一个StaffMember之后,页面返回到ServiceView并且一切正常,创建了新的StaffMemberAssignment以将StaffMember链接到服务。
但是,在查看StaffMembers列表时,用户可以选择“创建新的Staffmember”。这将打开StaffMemberView,其中包含一个新的StaffMember实例和viewmodel。在这里,用户可以输入新员工的详细信息,然后可以“保存更改”或“取消”。 “取消”只返回上一页并丢弃新创建的StaffMember实体,而“保存”则将新实体提交到数据库。然后返回StaffMembersListView,用户可以从列表中选择新的StaffMember,并返回到已进行新StaffMemberAssignment的ServiceView。

问题是
创建新的Staffmember后,保存它会将所有datacontext更改推送到DB。这意味着对用户忙碌的服务的任何编辑也已被推送到数据库。如果用户在创建新的StaffMember后选择“取消”该服务,则该服务将不会返回其原始状态。

所需的行为是,当创建StaffMember并且“保存”-d时,只有新的StaffMember被推送到DB。用户可以从列表中选择它,将其添加到服务中。然后,如果用户取消服务更改,则服务将返回其原始状态,但新创建的StaffMember将保留在StaffMember表中。毕竟,它已经被保存了。

谷歌搜索有选择地保存实体的方法给我的印象是不应该这样做。那么如何修改我的数据层设计或我的UI设计以获得我想要的功能呢?或者我想要的是不切实际的?

导致问题的最终步骤总结:

  1. 用户打开服务实体进行编辑
  2. 用户希望选择StaffMember链接到服务
  3. 用户创建新的StaffMember
  4. 新的StaffMember保存到DB 也会保存对服务的更改,但不应保存。
  5. 用户选择要添加的StaffMember     服务(新的或任何     其他)
  6. 用户取消对服务的更改。     服务必须返回原件     国家但不能,由于担保     保存在第4步。

1 个答案:

答案 0 :(得分:0)

使用不同的模型上下文实例创建StaffMember不是一个选项吗?