Gewusst wie: Ausführen von Geschäftslogik im Verlauf von Zuordnungsänderungen

Dieses Thema zeigt, wie Geschäftslogik ausgeführt wird, wenn sich eine Zuordnung zwischen Entitäten ändert.

Das Beispiel in diesem Thema beruht auf dem Adventure Works Sales-Modell. Zum Ausführen des Codes in diesem Thema muss dem Projekt bereits das Adventure Works Sales-Modell hinzugefügt und das Projekt zur Verwendung von Entity Framework konfiguriert worden sein. Weitere Informationen finden Sie unter Gewusst wie: Verwenden des Assistenten für Entity Data Model (Entity Framework) bzw. Gewusst wie: Manuelles Konfigurieren eines Entity Framework-Projekts und Gewusst wie: Manuelles Definieren eines Entity Data Model (Entity Framework).

Außerdem müssen Sie Ihrem Code die folgende using-Anweisung (Imports in Visual Basic) hinzufügen:

Imports System.ComponentModel
using System.ComponentModel;

Beispiel

Dieses Beispiel erweitert das im Thema Gewusst wie: Verwenden von EntityReference zum Ändern von Beziehungen zwischen Objekten (Entity Framework) verwendete Beispiel. In diesem Beispiel wird dargestellt, wie der Bestellstatus überprüft wird, wenn die Lieferadresse durch Behandlung des AssociationChanged-Ereignisses der EntityReference für das Address-Objekt, das der Lieferadresse entspricht, geändert wird. Wenn der Bestellstatus größer als 3 ist, kann die Bestellung nicht geändert werden, und es wird eine Ausnahme ausgelöst. Der Delegat wird im Konstruktor für die partielle Klasse SalesOrderHeader definiert. Der Handler für dieses Ereignis wird ebenfalls in dieser partiellen Klasse implementiert. So wird sichergestellt, dass der Bestellstatus immer dann überprüft wird, wenn die Lieferadresse für eine Bestellung geändert wird.

Sie können in diesem Fall auch die Methoden OnPropertyChanging oder OnPropertyChanged aufrufen, um das PropertyChanging-Ereignis oder das PropertyChanged-Ereignis auszulösen. Diese Ereignisse benachrichtigen die Clientsteuerelemente von der Änderung der Zuordnung.

Um die Änderungen am anderen Ende der SalesOrderHeader-Address-Beziehung zu validieren, kann eine ähnliche Technik verwendet werden, um das AssociationChanged-Ereignis in der EntityCollection von SalesOrderHeader-Objekten zu registrieren, die mit einer Lieferadresse verknüpft sind.

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");
        }
    }
}

Siehe auch

Aufgaben

Gewusst wie: Ausführen von Geschäftslogik, wenn sich der Objektzustand ändert
Gewusst wie: Ausführen von Geschäftslogik im Verlauf von Skalareigenschaftsänderungen (Entity Framework)
Gewusst wie: Ausführen von Geschäftslogik beim Speichern von Änderungen (Entity Framework)