Gewusst wie: Ausführen von Geschäftslogik im Verlauf von Skalareigenschaftsä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 Entity Data Model -Tools werden Datenklassen erstellt, die Entitäten in einem konzeptionellen Modell darstellen. Diese erstellten Klassen sollten zwar nicht direkt bearbeitet werden, die Tools generieren jedoch für jede erstellte Eigenschaft die beiden partiellen Methoden namens OnEigenschaftChanging und OnEigenschaftChanged, wobei Eigenschaft für den Eigenschaftsnamen steht Diese Methoden werden von Entity Framework vor und nach dem Ändern von Eigenschaften aufgerufen. Sie können die Methoden in partiellen Datenklassen erweitern, um benutzerdefinierten Code zu implementieren.

Cc716747.note(de-de,VS.100).gifHinweis:
Wenn der Code auf Objektebene mit einer anderen Textvorlage als einer Standardtextvorlage generiert wurde, wurden die partiellen Methoden möglicherweise nicht generiert.

Das Beispiel in diesem Thema beruht auf dem Adventure Works 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 der Modell- und Zuordnungsdateien (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:

    • On Eigenschaft Changing – 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.

    • On Eigenschaft Changed – 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 Me.SalesOrderHeaderReference.IsLoaded Then
                    Me.SalesOrderHeaderReference.Load()
                End If

                ' Cancel the change if the order cannot be modified. 
                If Me.SalesOrderHeader.Status > 3 Then
                    Throw New InvalidOperationException("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 '" & _
                    Me.SalesOrderDetailID.ToString() & "' in order '" & _
                    Me.SalesOrderHeader.SalesOrderID.ToString() & _
                    "' changing from '" + Me.OrderQty.ToString() & _
                    "' to '" & value.ToString() + "'." & Environment.NewLine & _
                    "Change made by user: " & Environment.UserName & _
                    Environment.NewLine)
            Catch ex As InvalidOperationException
                Throw New InvalidOperationException(("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. 
                Me.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 InvalidOperationException(("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 InvalidOperationException("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 InvalidOperationException("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 InvalidOperationException("An error occurred; "
                + "the data could be in an inconsistent state. "
                + Environment.NewLine + ex.Message);
            }
        }
    }
}

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 Zuordnungsänderungen
Gewusst wie: Ausführen von Geschäftslogik beim Speichern von Änderungen (Entity Framework)

Weitere Ressourcen

Entity Data Model Tools