Implementera affärslogik (LINQ till SQL)
Termen "affärslogik" i det här avsnittet refererar till alla anpassade regler eller valideringstester som du tillämpar på data innan de infogas, uppdateras eller tas bort från databasen. Affärslogik kallas ibland även för "affärsregler" eller "domänlogik". I n-nivåprogram är det vanligtvis utformat som ett logiskt lager så att det kan ändras oberoende av presentationslagret eller dataåtkomstskiktet. Affärslogik kan anropas av dataåtkomstlagret före eller efter en uppdatering, infogning eller borttagning av data i databasen.
Affärslogik kan vara så enkel som en schemavalidering för att se till att typen av fält är kompatibel med typen av tabellkolumn. Eller så kan den bestå av en uppsättning objekt som interagerar på godtyckligt komplexa sätt. Reglerna kan implementeras som lagrade procedurer i databasen eller som minnesinterna objekt. Men affärslogik implementeras, LINQ till SQL gör att du kan använda partiella klasser och partiella metoder för att skilja affärslogik från dataåtkomstkoden.
Så här anropar LINQ till SQL din affärslogik
När du genererar en entitetsklass vid designtillfället, antingen manuellt eller med hjälp av Object Relational Designer eller SQLMetal, definieras den som en partiell klass. Det innebär att du i en separat kodfil kan definiera en annan del av entitetsklassen som innehåller din anpassade affärslogik. Vid kompileringstillfället sammanfogas de två delarna i en enda klass. Men om du måste återskapa entitetsklasserna med hjälp av Object Relational Designer eller SQLMetal kan du göra det och din del av klassen kommer inte att ändras.
De partiella klasser som definierar entiteter och innehåller DataContext partiella metoder. Det här är de utökningspunkter som du kan använda för att tillämpa din affärslogik före och efter en uppdatering, infogning eller borttagning för en entitets- eller entitetsegenskap. Partiella metoder kan betraktas som kompileringstidshändelser. Kodgeneratorn definierar en metodsignatur och anropar metoderna i get- och set-egenskapsåtkomsterna, DataContext
konstruktorn och i vissa fall bakom kulisserna när SubmitChanges anropas. Men om du inte implementerar en viss partiell metod tas alla referenser till den och definitionen bort vid kompileringstillfället.
I den implementeringsdefinition som du skriver i din separata kodfil kan du utföra den anpassade logik som krävs. Du kan använda själva den partiella klassen som domänlager eller anropa från implementeringsdefinitionen för den partiella metoden till ett separat objekt eller objekt. Hur som helst separeras affärslogik rent från både dataåtkomstkoden och presentationslagrets kod.
En närmare titt på utökningspunkterna
I följande exempel visas en del av koden som genereras av Object Relational Designer för DataContext
klassen som har två tabeller: Customers
och Orders
. Observera att metoderna Insert, Update och Delete definieras för varje tabell i klassen.
Partial Public Class Northwnd
Inherits System.Data.Linq.DataContext
Private Shared mappingSource As _
System.Data.Linq.Mapping.MappingSource = New _
AttributeMappingSource
#Region "Extensibility Method Definitions"
Partial Private Sub OnCreated()
End Sub
Partial Private Sub InsertCustomer(instance As Customer)
End Sub
Partial Private Sub UpdateCustomer(instance As Customer)
End Sub
Partial Private Sub DeleteCustomer(instance As Customer)
End Sub
Partial Private Sub InsertOrder(instance As [Order])
End Sub
Partial Private Sub UpdateOrder(instance As [Order])
End Sub
Partial Private Sub DeleteOrder(instance As [Order])
End Sub
#End Region
public partial class MyNorthWindDataContext : System.Data.Linq.DataContext
{
private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();
#region Extensibility Method Definitions
partial void OnCreated();
partial void InsertCustomer(Customer instance);
partial void UpdateCustomer(Customer instance);
partial void DeleteCustomer(Customer instance);
partial void InsertOrder(Order instance);
partial void UpdateOrder(Order instance);
partial void DeleteOrder(Order instance);
#endregion
Om du implementerar metoderna Insert, Update och Delete i din partiella klass anropar LINQ till SQL-körningen dem i stället för sina egna standardmetoder när SubmitChanges anropas. På så sätt kan du åsidosätta standardbeteendet för att skapa/läsa/uppdatera/ta bort åtgärder. Mer information finns i Genomgång: Anpassa beteendet för infogning, uppdatering och borttagning av entitetsklasser.
Metoden OnCreated
anropas i klasskonstruktorn.
Public Sub New(ByVal connection As String)
MyBase.New(connection, mappingSource)
OnCreated()
End Sub
public MyNorthWindDataContext(string connection) :
base(connection, mappingSource)
{
OnCreated();
}
Entitetsklasserna har tre metoder som anropas av LINQ till SQL-körningen när entiteten skapas, läses in och verifieras (när SubmitChanges
anropas). Entitetsklasserna har också två partiella metoder för varje egenskap, en som anropas innan egenskapen anges och en som anropas efter. I följande kodexempel visas några av de metoder som genererats för Customer
klassen:
#Region "Extensibility Method Definitions"
Partial Private Sub OnLoaded()
End Sub
Partial Private Sub OnValidate(action As _
System.Data.Linq.ChangeAction)
End Sub
Partial Private Sub OnCreated()
End Sub
Partial Private Sub OnCustomerIDChanging(value As String)
End Sub
Partial Private Sub OnCustomerIDChanged()
End Sub
Partial Private Sub OnCompanyNameChanging(value As String)
End Sub
Partial Private Sub OnCompanyNameChanged()
End Sub
' ...Additional Changing/Changed methods for each property.
#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate();
partial void OnCreated();
partial void OnCustomerIDChanging(string value);
partial void OnCustomerIDChanged();
partial void OnCompanyNameChanging(string value);
partial void OnCompanyNameChanged();
// ...additional Changing/Changed methods for each property
Metoderna anropas i egenskapsuppsättningsåtkomstorn enligt följande exempel för CustomerID
egenskapen:
Public Property CustomerID() As String
Set
If (String.Equals(Me._CustomerID, value) = False) Then
Me.OnCustomerIDChanging(value)
Me.SendPropertyChanging()
Me._CustomerID = value
Me.SendPropertyChanged("CustomerID")
Me.OnCustomerIDChanged()
End If
End Set
End Property
public string CustomerID
{
set
{
if ((this._CustomerID != value))
{
this.OnCustomerIDChanging(value);
this.SendPropertyChanging();
this._CustomerID = value;
this.SendPropertyChanged("CustomerID");
this.OnCustomerIDChanged();
}
}
}
I din del av klassen skriver du en implementeringsdefinition av metoden. När du har skrivt partial
i Visual Studio visas IntelliSense för metoddefinitionerna i den andra delen av klassen.
Partial Public Class Customer
Private Sub OnCustomerIDChanging(value As String)
' Perform custom validation logic here.
End Sub
End Class
partial class Customer
{
partial void OnCustomerIDChanging(string value)
{
//Perform custom validation logic here.
}
}
Mer information om hur du lägger till affärslogik i ditt program med hjälp av partiella metoder finns i följande avsnitt:
Gör så här: Lägga till validering i entitetsklasser
Genomgång: Anpassa infognings-, uppdaterings- och borttagningsbeteendet för entitetsklasser
Genomgång: Lägga till validering i entitetsklasser