Хобрук: Ваш путь к мастерству в программировании

Отмена и отказ от изменений в Entity Framework и WPF

Я разрабатываю систему, в которой у пользователя есть формы для заполнения, и эта информация хранится в базе данных. На одном из экранов у меня есть следующий поток:

  • Внутри проекта он может добавить несколько заказов.
  • Каждый добавленный заказ открывает экран конфигурации, на котором можно установить внутреннюю информацию заказа. Также есть возможность добавлять позиции в заказ.
  • Каждый добавленный элемент открывает экран конфигурации, который позволяет пользователю установить внутреннюю информацию.

Подводя итог, поток выглядит следующим образом: Проект -> Заказ -> Элемент, где «A -> B» означает, что A содержит 0, 1 или более B.

Этот проект разрабатывается с использованием WPF с Entity Framework для управления доступом к базе данных. Я связываю объекты из базы данных Entity, отображая их непосредственно на экранах. Таким образом, у нас есть некоторые «преимущества» с WPF, например, ненулевые поля окрашены в красный цвет. Кроме того, код намного проще. Объекты обновляются (или добавляются) в базу данных только при сохранении проекта. Таким образом, элементы можно редактировать, затем можно редактировать заказы, и они сохраняются только при сохранении проекта, поскольку они зависят от сохраняемого идентификатора проекта.

Однако прямое использование сопоставленных сущностей имеет огромную проблему: допустим, пользователь редактирует элемент внутри заказа. Затем он снова редактирует его, но на этот раз вместо нажатия «ОК» пользователь нажимает «Отмена». Изменения должны быть отменены. Однако предыдущее состояние было потеряно, так как оно не обновлялось в базе данных и менялось из-за привязки WPF.

Каков наилучший подход для предотвращения этой проблемы? Я не знаю, хорошо ли создание клонов работает в Entity Framework. И создание переменных, которые передают свои значения объекту только при нажатии команды подтверждения, противоречило бы шаблону MVVM и заставило бы меня потерять «преимущества», о которых я уже говорил.

Помогите мне, пожалуйста!

Спасибо!


  • Не можете ли вы просто вызвать SaveChanges в вашем контексте, когда пользователь нажимает «ОК»? Это сохранит изменения из первого редактирования, так что значения вернутся после того, как пользователь отменит второе редактирование. 11.08.2012
  • EF отслеживает старые и новые значения в файле ObjectStateManager. Вы можете получить к ним доступ следующим образом: stackoverflow.com/a/11250496/861716. Точно так же вы можете использовать эти значения для перезаписи новых значений старыми, когда пользователь отменяет свое редактирование. 11.08.2012
  • Во многих случаях все преимущества, предоставляемые различными API, предназначены только для простых сценариев. Когда дело доходит до реального проекта с его сложностями, вы должны запачкать руки и начать программировать, а не надеяться, что произойдет чудо. Ваше требование напрямую противоречит привязке живых объектов к вашему пользовательскому интерфейсу, потому что вы хотите сохранить несохраненные изменения, если пользователь решит отменить свое текущее редактирование. 11.08.2012

Новые материалы

React on Rails
Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

Что такое гибкие методологии разработки программного обеспечения
Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

Ториго  — революция в игре Го
Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

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

Раскрытие возможностей НЛП: часть речевой маркировки и ее проблемы
В сфере обработки естественного языка (NLP) маркировка частей речи (POS) выступает в качестве фундаментального метода, позволяющего компьютерам понимать и анализировать человеческий язык на..

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