Как обеспечить выполнение бизнес-логики при изменении ассоциаций

В этом разделе показано, как реализовать выполнение бизнес-логики при изменении ассоциации между сущностями.

Пример в этом разделе основан на модели Adventure Works Sales. Чтобы запустить код, используемый в данном разделе, нужно сначала добавить к проекту модель Adventure Works Sales и настроить его для использования платформы Entity Framework. Дополнительные сведения см. в разделе Как использовать мастер моделей EDM (Entity Framework) или Как вручную настроить проект Entity Framework и Как определить модель EDM вручную (Entity Framework).

Необходимо также добавить в код следующую инструкцию using (Imports в Visual Basic):

Imports System.ComponentModel
using System.ComponentModel;

Пример

Этот пример расширяет пример из раздела Как изменить связи между объектами с помощью объекта EntityReference (платформа Entity Framework). Пример показывает, каким образом можно проверить состояние заказа, если адрес доставки был изменен путем обработки события AssociationChanged в экземпляре EntityReference для объекта Address, представляющего адрес доставки. Если состояние запроса больше 3, заказ не может быть изменен и вызывается исключение. Делегат, определенный в конструкторе для разделяемого класса SalesOrderHeader, и обработчик для данного события также реализуются в данном разделяемом классе. Это обеспечивает выполнение проверки состояния заказа при любом изменении адреса доставки заказа.

Кроме того, в этом событии можно вызвать методы OnPropertyChanging и OnPropertyChanged для вызова соответствующих событий PropertyChanging и PropertyChanged. Эти события уведомляют клиентские элементы управления об изменениях ассоциации.

Чтобы проверить изменения на другом конце связи SalesOrderHeader-Address, аналогичного результата можно добиться, зарегистрировав событие AssociationChanged в коллекции EntityCollection объекта SalesOrderHeader, связанного с адресом доставки.

Partial Public Class SalesOrderHeader
    ' SalesOrderHeader default constructor. 
    Public Sub New()
        ' Register the handler for changes to the 
        ' shipping address (Address1) reference. 
        AddHandler Me.AddressReference.AssociationChanged, AddressOf ShippingAddress_Changed
    End Sub

    ' AssociationChanged handler for the relationship 
    ' between the order and the shipping address. 
    Private Sub ShippingAddress_Changed(ByVal sender As Object, ByVal e As CollectionChangeEventArgs)
        ' Check for a related reference being removed. 
        If e.Action = CollectionChangeAction.Remove Then
            ' Check the order status and raise an exception if 
            ' the order can no longer be changed. 
            If Me.Status > 3 Then
                Throw New InvalidOperationException("The shipping address cannot " & _
                                                    "be changed because the order has either " & _
                                                    "already been shipped or has been cancelled.")
            End If
            ' Call the OnPropertyChanging method to raise the PropertyChanging event. 
            ' This event notifies client controls that the association is changing. 
            Me.OnPropertyChanging("Address1")
        ElseIf e.Action = CollectionChangeAction.Add Then
            ' Call the OnPropertyChanged method to raise the PropertyChanged event. 
            ' This event notifies client controls that the association has changed. 
            Me.OnPropertyChanged("Address1")
        End If
    End Sub
End Class
public partial class SalesOrderHeader
{
    // SalesOrderHeader default constructor.
    public SalesOrderHeader()
    {
        // Register the handler for changes to the 
        // shipping address (Address1) reference.
        this.AddressReference.AssociationChanged
            += new CollectionChangeEventHandler(ShippingAddress_Changed);
    }

    // AssociationChanged handler for the relationship 
    // between the order and the shipping address.
    private void ShippingAddress_Changed(object sender,
        CollectionChangeEventArgs e)
    {
        // Check for a related reference being removed. 
        if (e.Action == CollectionChangeAction.Remove)
        {
            // Check the order status and raise an exception if 
            // the order can no longer be changed.
            if (this.Status > 3)
            {
                throw new InvalidOperationException(
                    "The shipping address cannot "
                + "be changed because the order has either "
                + "already been shipped or has been cancelled.");
            }
            // Call the OnPropertyChanging method to raise the PropertyChanging event.
            // This event notifies client controls that the association is changing.
            this.OnPropertyChanging("Address1");
        }
        else if (e.Action == CollectionChangeAction.Add)
        {
            // Call the OnPropertyChanged method to raise the PropertyChanged event.
            // This event notifies client controls that the association has changed.
            this.OnPropertyChanged("Address1");
        }
    }
}

См. также

Задачи

Как выполнять бизнес-логику при изменении состояния объекта
Как выполнить бизнес-логику при изменении скалярных свойств (платформа Entity Framework)
Как выполнять правила бизнес-логики при сохранении изменений (платформа Entity Framework)