在父窗口中使用来自子窗口的缓存数据而无需访问数据库

时间:2012-01-10 18:32:43

标签: wpf entity-framework-4 mvvm-light

我正在寻找一种设计方法,因此我没有任何代码可供分享。

我有一个WPF富客户端应用程序,它向用户显示详细数据。当用户单击“编辑”时,整个表单进入编辑状态。这显示了几个“添加”按钮。这些“添加”按钮打开子视图,为用户提供创建新实体的工具。想一想“向您正在使用的客户订单添加新商品”。这很容易。

当用户关闭这些子视图时,必须在父视图中显示和编辑新实体,以便继续进行详细编辑。类似于“在子表单上添加新项目,选择部件号,然后关闭子项并在父视图上添加数量和交付日期。我在这个工作流程中没有任何灵活性。我也有这个工作。” / p>

当用户完成父视图并对新添加的项目和详细编辑感到满意后,可以单击“保存”。那时所有的更改都需要返回数据库。如果用户单击取消,则包含在子视图上创建的实体的所有更改都必须消失,并且表单将返回其原始状态。

最后一点让我感到困惑。我几乎是Entity Framework的新手,所以我想我可以以某种方式在客户端上保留内存中的整个更改集,并在user-Save点将所有更改提交到数据库。我不知道是否可能,或者我必须如何改变我的数据更改以防止意外访问数据库。

要将所有事实放在桌面上,我使用的是工作单元模式,但如果需要,我可以访问EF上下文对象。如果我必须使用上下文对象,我必须跨多个视图及其相关的视图模型这样做。

我已经查看了很多stackoverflow Q& A但是无法找到或者认识到解决方案路径。我有一些关于使用克隆实体或可能是交易的想法,但不知道是否有其他人或如何在他们之间做出选择。这些将是新技能,需要花费时间学习。我愿意花时间学习一项新技能,但不要学习和尝试三到四个。

我很感激您提出的任何建议。

1 个答案:

答案 0 :(得分:1)

在构造函数上从DB记录时读取值两次。一个私有变量用于当前,一个用于旧。

 private string lNameOld;
 private string lName;

 public string LName 
 {
     get { return lName; }
     set 
     {
         if(lName == value) return;
         lName = value;
         NotifyPropertyChanged("LName");
      }
  }

  public void save()
  {
      if (lName != lNameOld)
      {
          // write to database 
          // really should process all in a transaction
          lNameOld = lName;
      }
  {

  public void cancel()
  {
      if (lName != lNameOld)
      {
          Lname = lNameOld;  // notice capital L so Notify is called
      }
  {