Как обеспечить выполнение бизнес-логики при изменении ассоциаций
В этом разделе показано, как реализовать выполнение бизнес-логики при изменении ассоциации между сущностями.
Пример в этом разделе основан на модели 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)