Partager via


Procédure : exécuter la logique métier lors de la modification des associations

Cette rubrique indique comment exécuter la logique métier lorsqu'une association entre des entités change.

L'exemple de cette rubrique est basé sur le modèle de vente Adventure Works Sales Model. Pour exécuter le code de cette rubrique, vous devez déjà avoir ajouté le modèle de vente AdventureWorks à votre projet et configuré ce dernier pour qu'il utilise Entity Framework. Pour plus d'informations, consultez Procédure : utiliser l'Assistant EDM (Entity Framework) ou Procédure : configurer manuellement un projet Entity Framework et Procédure : définir manuellement un modèle EDM (Entity Data Model) (Entity Framework).

Vous devez aussi ajouter l'instruction using suivante (Imports en Visual Basic) dans votre code :

Imports System.ComponentModel
using System.ComponentModel;

Exemple

Cet exemple est la suite de l'exemple de la rubrique Procédure : utiliser EntityReference pour modifier les relations entre des objets (Entity Framework). Il indique comment vérifier l'état de la commande lorsque l'adresse d'expédition change en gérant l'événement AssociationChanged sur le EntityReference pour l'objet Address qui représente l'adresse d'expédition. Si l'état de la commande est supérieur à 3, la commande ne peut pas être modifiée et une exception est déclenchée. Le délégué est défini dans le constructeur pour la classe partielle SalesOrderHeader et le gestionnaire de cet événement est également implémenté dans cette classe partielle. Cela garantit que l'état de la commande est vérifié toutes les fois que l'adresse d'expédition d'une commande est modifiée.

Vous pouvez également appeler les méthodes OnPropertyChanging et OnPropertyChanged dans cet événement pour déclencher les événements PropertyChanging et PropertyChanged, respectivement. Ces événements notifient les contrôles clients de modification de l'association.

Pour valider les modifications à l'autre terminaison de la relation SalesOrderHeader-Address, une technique semblable pourrait être utilisée pour enregistrer l'événement AssociationChanged sur le EntityCollection des objets SalesOrderHeader associés à une adresse d'expédition.

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

Voir aussi

Tâches

Procédure : exécuter la logique métier lors du changement d'état d'un objet
Procédure : exécuter la logique métier lors de la modification des propriétés scalaires (Entity Framework)
Procédure : exécuter la logique métier lors de l'enregistrement de modifications (Entity Framework)