Использование кэшированных данных из дочернего окна в родительском окне без обращения к базе данных - PullRequest
0 голосов
/ 10 января 2012

Я ищу подход к проектированию, поэтому у меня нет кода для обмена.

У меня есть приложение-клиент WPF rich-client, которое представляет подробные данные пользователю.Когда пользователь нажимает «Редактировать», вся форма переходит в состояние редактирования.Это показывает пару кнопок «Добавить».Эти кнопки «Добавить» открывают дочерние представления, предоставляя пользователю инструменты для создания новых объектов.Подумайте, «добавление нового товара в заказ клиента, с которым вы работаете».Это простая часть.

Когда пользователь закрывает эти дочерние представления, новые объекты должны отображаться и редактироваться в родительском представлении для продолжения подробного редактирования.Что-то типа «добавьте новый элемент в дочернюю форму, выберите номер детали, затем закройте дочерний элемент и добавьте количество и дату доставки в родительское представление. У меня нет никакой гибкости в этом рабочем процессе. У меня есть эта работа также.

Когда пользователь закончит с родительским представлением и будет удовлетворен вновь добавленными элементами и подробными изменениями, он может нажать «Сохранить». Это означает, что все изменения необходимо вернуться в базу данных. Если пользователь щелкаетотмена, все изменения, включая сущности, созданные в дочерних представлениях, должны исчезнуть, и форма вернулась в свое первоначальное состояние.

Это последний бит, который озадачивает меня. Я почти новичок в Entity Framework, поэтому я подумалЯ мог бы каким-то образом сохранить весь набор изменений в памяти на клиенте и зафиксировать все изменения в базе данных в момент сохранения пользователем. Я не знаю, возможно ли это, или как мне следует вносить изменения в свои данные, чтобы предотвратитьслучайные поездки в базу данных.

Чтобы положить все факты на стол, я использую унит работы, но у меня есть доступ к объекту контекста EF, если это необходимо.Если мне нужно работать с объектом контекста, я должен сделать это для нескольких представлений и связанных с ними моделей представлений.

Я рассмотрел множество вопросов и ответов по стеку, но не могу найти или, возможно, распознатьпуть решения.У меня есть некоторые идеи по поводу использования клонированных сущностей или, возможно, транзакций, но я не знаю, есть ли другие или как выбирать между ними.Это были бы новые навыки и потребовали бы времени, потраченного на обучение.Я готов потратить время на изучение нового навыка, но не учусь и пробую три или четыре.

Я благодарен за любой совет, который вы могли бы предложить.

1 Ответ

1 голос
/ 11 января 2012

В конструкторе при чтении из БД запишите значение дважды.Одна закрытая переменная для текущей и одна для старой.

 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
      }
  {
...