Share via


Gewusst wie: Ausführen von Geschäftslogik im Verlauf von Eigenschaftsänderungen (Entity Framework)

Mithilfe von Entity Framework kann benutzerdefinierte Geschäftslogik ausgeführt werden, um benutzerdefinierte Aufgaben zu erledigen, wenn Änderungen an erstellten Eigenschaften vorgenommen werden. Mit den Entitätsdatenmodell (EDM)-Tools werden Datenklassen erstellt, die Entitäten in einem EDM darstellen. Diese erstellten Klassen sollten zwar nicht direkt bearbeitet werden, die Tools generieren jedoch für jede erstellte Eigenschaft die beiden partiellen Methoden OnEigenschaftChanging und OnEigenschaftChanged, wobei Eigenschaft der Eigenschaftsname ist. Diese Methoden werden von Object Services vor und nach dem Ändern von Eigenschaften aufgerufen. Sie können die Methoden in partiellen Datenklassen erweitern, um benutzerdefinierten Code zu implementieren. Weitere Informationen zum Anpassen von erstellten Klassen finden Sie unter Anpassen von Objekten (Entity Framework).

Das Beispiel in diesem Thema beruht auf dem AdventureWorks Sales-Modell. Zum Ausführen des Codes in diesem Beispiel müssen Sie dem Projekt bereits das AdventureWorks Sales-Modell hinzugefügt und das Projekt zur Verwendung des Entity Framework konfiguriert haben. Führen Sie dazu die Verfahren unter Gewusst wie: Manuelles Konfigurieren eines Entity Framework-Projekts und Gewusst wie: Manuelles Definieren eines Entity Data Model (Entity Framework) durch.

So implementieren Sie benutzerdefinierte Validierung für Eigenschaftsänderungen

  1. Definieren Sie im Projekt eine benutzerdefinierte partielle Klasse für jede zu validierende Datenklasse.

  2. Definieren Sie in dieser partiellen Klasse eine oder beide der folgenden Methoden, wobei Eigenschaft der Name der zu validierenden Eigenschaft ist:

    • OnEigenschaftChanging – Enthält Code, der ausgeführt wird, bevor die Änderung auftritt, z. B. als Eigenschaftsvalidierung. Der Parameter value stellt den Wert dar, zu dem die Eigenschaft geändert wird. Implementieren Sie diese Methode, um eine Eigenschaftsänderung vor deren Auftreten zu validieren. Um die Änderung zu verhindern, muss eine Ausnahme ausgelöst werden.

    • OnEigenschaftChanged – Enthält Code, der ausgeführt wird, nachdem die Änderung auftritt, z. B. Änderungsprotokollierung.

Beispiel

In diesem Beispiel wird der Wert von SalesOrderHeader.Status geprüft, um sicherzustellen, dass die Reihenfolge geändert werden kann, bevor eine Änderung an SalesOrderDetail.OrderQty vorgenommen und die ausstehende Änderung in einer Datei protokolliert wird. Diese Operation wird in der partiellen Methode OnOrderQtyChanging durchgeführt. Wenn die Änderung nicht vorgenommen werden kann, wird eine Ausnahme ausgelöst. Wenn die Änderung erfolgreich durchgeführt wurde, wird der Wert SalesOrderHeader.Status auf "1" zurückgesetzt, und die abgeschlossene Änderung wird protokolliert. Diese Operationen werden in der partiellen Methode OnOrderQtyChanged durchgeführt.

Partial Public Class SalesOrderDetail
    Inherits EntityObject
    Private Sub OnOrderQtyChanging(ByVal value As Short)
        ' Only handle this change for existing SalesOrderHeader 
        ' objects that are attached to an object context. If the item
        ' is detached then we cannot access or load the related order.
        If EntityState <> EntityState.Detached Then
            Try
                ' Ensure that the referenced SalesOrderHeader is loaded.
                If Not SalesOrderHeaderReference.IsLoaded Then
                    SalesOrderHeaderReference.Load()
                End If

                Dim order As SalesOrderHeader = SalesOrderHeader

                ' Cancel the change if the order cannot be modified.
                If SalesOrderHeader.Status > 3 Then
                    Throw New ApplicationException("The quantity cannot be changed " _
                    + "or the item cannot be added because the order has either " _
                    + "already been shipped or has been cancelled.")
                End If

                ' Log the pending order change.
                File.AppendAllText(LogFile, "Quantity of item '" _
                    + SalesOrderDetailID.ToString() + "' in order '" _
                    + order.SalesOrderID.ToString() _
                    + "' changing from '" + OrderQty.ToString() _
                    + "' to '" + value.ToString() + "'." + Environment.NewLine _
                    + "Change made by user: " + Environment.UserName _
                    + Environment.NewLine)
            Catch ex As InvalidOperationException
                Throw New ApplicationException("The quantity could not be changed " _
                + " because the order information could not be retrieved. " _
                + "The following error occurred:" + ex.Message)
            End Try
        End If
    End Sub
    Private Sub OnOrderQtyChanged()
        ' Only handle this change for existing SalesOrderHeader 
        ' objects that are attached to an object context.
        If EntityState <> EntityState.Detached Then
            Try
                ' Ensure that the SalesOrderDetail is loaded.
                If Not SalesOrderHeaderReference.IsLoaded Then
                    SalesOrderHeaderReference.Load()
                End If

                ' Reset the status for the order related to this item.
                SalesOrderHeader.Status = 1

                ' Log the completed order change.
                File.AppendAllText(LogFile, "Quantity of item '" _
                    + SalesOrderDetailID.ToString() + "' in order '" _
                    + SalesOrderHeader.SalesOrderID.ToString() _
                    + "' successfully changed to '" + OrderQty.ToString() _
                    + "'." + Environment.NewLine _
                    + "Change made by user: " + Environment.UserName _
                    + Environment.NewLine)
            Catch ex As InvalidOperationException
                Throw New ApplicationException("An error occurred " _
                + "the data could be in an inconsistent state. " _
                + Environment.NewLine + ex.Message)
            End Try
        End If
    End Sub
End Class
public partial class SalesOrderDetail : EntityObject
{
    partial void OnOrderQtyChanging(short value)
    {
        // Only handle this change for existing SalesOrderHeader 
        // objects that are attached to an object context. If the item
        // is detached then we cannot access or load the related order.
        if (EntityState != EntityState.Detached)
        {
            try
            {
                // Ensure that the referenced SalesOrderHeader is loaded.
                if (!this.SalesOrderHeaderReference.IsLoaded)
                {
                    this.SalesOrderHeaderReference.Load();
                }

                // Cancel the change if the order cannot be modified.
                if (this.SalesOrderHeader.Status > 3)
                {
                    throw new ApplicationException("The quantity cannot be changed "
                    + "or the item cannot be added because the order has either "
                    + "already been shipped or has been cancelled.");
                }

                // Log the pending order change.
                File.AppendAllText(LogFile, "Quantity of item '"
                    + this.SalesOrderDetailID.ToString() + "' in order '"
                    + this.SalesOrderHeader.SalesOrderID.ToString()
                    + "' changing from '" + this.OrderQty.ToString()
                    + "' to '" + value.ToString() + "'." + Environment.NewLine
                    + "Change made by user: " + Environment.UserName
                    + Environment.NewLine);
            }
            catch (InvalidOperationException ex)
            {
                throw new ApplicationException("The quantity could not be changed "
                + " because the order information could not be retrieved. "
                + "The following error occurred:" + ex.Message);
            }
        }
    }
    partial void OnOrderQtyChanged()
    {
        // Only handle this change for existing SalesOrderHeader 
        // objects that are attached to an object context.
        if (EntityState != EntityState.Detached)
        {
            try
            {
                // Ensure that the SalesOrderDetail is loaded.
                if (!SalesOrderHeaderReference.IsLoaded)
                {
                    SalesOrderHeaderReference.Load();
                }

                // Reset the status for the order related to this item.
                this.SalesOrderHeader.Status = 1;

                // Log the completed order change.
                File.AppendAllText(LogFile, "Quantity of item '"
                    + SalesOrderDetailID.ToString() + "' in order '"
                    + SalesOrderHeader.SalesOrderID.ToString()
                    + "' successfully changed to '" + OrderQty.ToString()
                    + "'." + Environment.NewLine
                    + "Change made by user: " + Environment.UserName
                    + Environment.NewLine);
            }
            catch (InvalidOperationException ex)
            {
                throw new ApplicationException("An error occurred; "
                + "the data could be in an inconsistent state. "
                + Environment.NewLine + ex.Message);
            }
        }
    }
}

Siehe auch

Weitere Ressourcen

Entity Data Model-Tools