Поделиться через


Иерархическое обновление в разработке платформа .NET Framework

Примечание.

Наборы данных и связанные классы являются устаревшими технологиями платформа .NET Framework с начала 2000-х годов, которые позволяют приложениям работать с данными в памяти во время отключения приложений от базы данных. Технологии особенно полезны для приложений, которые позволяют пользователям изменять данные и сохранять изменения обратно в базу данных. Хотя наборы данных оказались очень успешными, мы рекомендуем новым приложениям .NET использовать Entity Framework Core. Entity Framework предоставляет более естественный способ работы с табличными данными в виде объектных моделей, и он имеет более простой интерфейс программирования.

Иерархическое обновление относится к процессу сохранения обновленных данных (из набора данных с двумя или более связанными таблицами) обратно в базу данных при сохранении правил целостности ссылок. Ссылочная целостность относится к правилам согласованности, предоставляемым ограничениями в базе данных, которые управляют поведением вставки, обновления и удаления связанных записей. Например, это ссылочная целостность, которая применяет создание записи клиента, прежде чем разрешать создавать заказы для этого клиента. Дополнительные сведения о связях в наборах данных см. в разделе "Связи" в наборах данных.

Функция иерархического обновления использует TableAdapterManager управление TableAdapters в типизированном наборе данных. Компонент TableAdapterManager является классом, созданным Visual Studio, а не типом .NET. При перетаскивании таблицы из окна источников данных на страницу Windows Form или WPF Visual Studio добавляет переменную типа TableAdapterManager в форму или страницу, и вы увидите ее в конструкторе в области компонентов. Подробные сведения о TableAdapterManager классе см. в разделе Справочника TableAdapterManager tableAdapters.

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

Включение иерархического обновления в наборе данных

По умолчанию иерархическое обновление включено для всех новых наборов данных, которые добавляются или создаются в проекте. Включите или отключите иерархическое обновление, задав свойство Иерархического обновления типизированного набора данных в наборе данных значение True или False:

Параметр иерархического обновления

Создание нового отношения между таблицами

Чтобы создать новое отношение между двумя таблицами, в конструкторе наборов данных выберите заголовок каждой таблицы, а затем щелкните правой кнопкой мыши и выберите "Добавить отношение".

Иерархическое меню добавления реляционного обновления

Общие сведения о ограничениях внешнего ключа, каскадных обновлениях и удалениях

Важно понимать, как ограничения внешнего ключа и каскадное поведение в базе данных создаются в созданном коде набора данных.

По умолчанию таблицы данных в наборе данных создаются с помощью связей (DataRelation), которые соответствуют связям в базе данных. Однако связь в наборе данных не создается как ограничение внешнего ключа. Он DataRelation настраивается как "Только отношение" без UpdateRule или DeleteRule в действии.

По умолчанию каскадные обновления и каскадные удаления отключены, даже если связь базы данных устанавливается с каскадными обновлениями или каскадными удалениями. Например, создание нового клиента и нового заказа, а затем попытка сохранить данные может привести к конфликту с ограничениями внешнего ключа, определенными в базе данных. Дополнительные сведения см. в разделе "Отключение ограничений при заполнении набора данных".

Настройка порядка выполнения обновлений

Задание порядка выполнения обновлений задает порядок отдельных вставок, обновлений и удалений, необходимых для сохранения всех измененных данных во всех таблицах набора данных. При включении иерархического обновления сначала выполняются вставки, а затем обновляются, а затем удаляются. Предоставляет TableAdapterManager свойство, которое можно задать для выполнения обновлений UpdateOrder сначала, а затем вставляется, а затем удаляется.

Примечание.

Важно понимать, что порядок обновления является все включено. То есть при выполнении обновлений вставка и удаление выполняются для всех таблиц в наборе данных.

Чтобы задать UpdateOrder свойство, после перетаскивания элементов из окна источников данных в форму выберите TableAdapterManager область компонента и задайте UpdateOrder свойство в окне "Свойства ".

Создание резервной копии набора данных перед выполнением иерархического обновления

При сохранении данных (путем вызова TableAdapterManager.UpdateAll() метода) TableAdapterManager пытается обновить данные для каждой таблицы в одной транзакции. Если любая часть обновления для любой таблицы завершается ошибкой, откат всей транзакции выполняется. В большинстве случаев откат возвращает приложение в исходное состояние.

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

Примечание.

Резервная копия находится только в памяти во время TableAdapterManager.UpdateAll выполнения метода. Поэтому программный доступ к этому набору данных резервного копирования отсутствует, так как он заменяет исходный набор данных или выходит из области сразу после TableAdapterManager.UpdateAll завершения выполнения метода.

Изменение созданного кода сохранения для выполнения иерархического обновления

Сохраните изменения из связанных таблиц данных набора данных в базу данных, вызвав метод TableAdapterManager.UpdateAll и передав имя набора данных, содержащего связанные таблицы. Например, запустите метод TableAdapterManager.UpdateAll(NorthwindDataset) для отправки обновлений из всех таблиц в NorthwindDataset во внутреннюю базу данных.

После удаления элементов из окна Источники данных в событие Form_Load автоматически добавляется код для заполнения каждой таблицы (методы TableAdapter.Fill). Код также добавляется в событие нажатия кнопки Сохранить объекта BindingNavigator, чтобы сохранить данные из набора данных обратно в базу данных (метод TableAdapterManager.UpdateAll).

Сформированный код сохранения также содержит строку, вызывающую метод CustomersBindingSource.EndEdit. В частности, он вызывает EndEdit метод первого BindingSource, добавляемого в форму. Другими словами, этот код создается только для первой таблицы, перетаскиваемой из окна источников данных в форму. Вызов EndEdit фиксирует все актуальные изменения для всех редактируемых в настоящее время элементов управления с привязкой к данным. Таким образом, если элемент управления с привязкой к данным все еще находится в фокусе и вы нажимаете кнопку Сохранить, все ожидающие правки в этом элементе управления фиксируются до фактического сохранения (метод TableAdapterManager.UpdateAll).

Примечание.

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

  1. Дважды нажмите кнопку Сохранить на BindingNavigator, чтобы открыть Form1 в редакторе кода.

  2. Добавьте строку кода для вызова метода OrdersBindingSource.EndEdit после строки, вызывающей метод CustomersBindingSource.EndEdit. Код в событии нажатия кнопки Сохранить должен выглядеть примерно следующим образом:

    this.Validate();
    this.customersBindingSource.EndEdit();
    this.ordersBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.northwindDataSet);
    

Кроме фиксации изменений в связанной дочерней таблице перед сохранением данных в базе данных, вам также может понадобиться фиксировать недавно созданные родительские записи перед добавлением новых дочерних записей в базу данных. Другими словами, может потребоваться добавить новую родительскую запись (Customer) в набор данных, прежде чем ограничения внешнего ключа позволяют добавлять новые дочерние записи (Orders) в набор данных. Для этого можно использовать дочернее событие BindingSource.AddingNew.

Примечание.

Требуется ли фиксация новых родительских записей, зависит от типа элемента управления, используемого для привязки к источнику данных. В этом пошаговом руководстве вы используете отдельные элементы управления для привязки к родительской таблице. Для этого требуется дополнительный код для фиксации новой родительской записи. Если родительские записи вместо этого отображались в сложном элементе управления привязкой, например в этом DataGridViewдополнительном EndEdit вызове родительской записи, не потребуется. Это вызвано тем, что базовая функциональность привязки к данным элемента управления обрабатывает фиксацию новых записей.

Добавление кода для фиксации родительских записей в наборе данных перед добавлением новых дочерних записей

  1. Создайте обработчик событий для события OrdersBindingSource.AddingNew.

    • Откройте Форму1 в режиме конструктора, выберите OrdersBindingSource в области компонентов, выберите "События " в окне "Свойства ", а затем дважды щелкните событие "ДобавитьNew ".
  2. Добавьте строку кода в обработчик событий, который вызывает CustomersBindingSource.EndEdit метод. Код в обработчике событий OrdersBindingSource_AddingNew должен выглядеть примерно следующим образом:

    this.customersBindingSource.EndEdit();
    

Справочник по TableAdapterManager

По умолчанию TableAdapterManager класс создается при создании набора данных, содержащего связанные таблицы. Чтобы предотвратить создание класса, измените значение Hierarchical Update свойства набора данных на false. При перетаскивании таблицы, которая имеет отношение к области конструктора страницы Windows Form или WPF, Visual Studio объявляет переменную члена класса. Если вы не используете привязку данных, необходимо вручную объявить переменную.

Класс TableAdapterManager не является типом .NET. Поэтому его невозможно найти в документации. Он создается во время разработки в рамках процесса создания набора данных.

Ниже приведены часто используемые методы и свойства TableAdapterManager класса:

Элемент Description
UpdateAllМетод Сохраняет все данные из всех таблиц данных.
Свойство BackUpDataSetBeforeUpdate Определяет, следует ли создавать резервную копию набора данных перед выполнением TableAdapterManager.UpdateAll метода. Булев.
Свойство tableName TableAdapter TableAdapterПредставляет объект . TableAdapterManager Созданный объект содержит свойство для каждого TableAdapter управляемого элемента управления. Например, набор данных с таблицей "Клиенты и заказы" создается с TableAdapterManager помощью набора данных, содержащего CustomersTableAdapter и OrdersTableAdapter свойства.
Свойство UpdateOrder Управляет порядком отдельных команд вставки, обновления и удаления. Задайте для этого одно из значений перечисления TableAdapterManager.UpdateOrderOption .

По умолчанию UpdateOrder для свойства InsertUpdateDelete задано значение InsertUpdateDelete. Это означает, что вставки, а затем обновления, а затем удаления выполняются для всех таблиц в наборе данных.