Hinzufügen von Geschäftslogik durch das Verwenden partieller Methoden (LINQ to SQL)

Aktualisiert: November 2007

Sie können den von Visual Basic und C# erzeugten Code in Ihren LINQ to SQL-Projekten anpassen, indem Sie partielle Methoden verwenden. Der von LINQ to SQL erzeugte Code definiert Signaturen als einen Teil einer partiellen Methode. Wenn Sie die Methode implementieren möchten, können Sie eine eigene partielle Methode hinzufügen. Wenn Sie keine eigene Implementierung hinzufügen, verwirft der Compiler die partielle Methodensignatur und ruft die Standardmethoden in LINQ to SQL auf.

Hinweis:

Bei der Verwendung von Visual Studio können mit O/R-Designer Validierungen und andere Anpassungen in die Entitätsklasse eingefügt werden.

Die Standardzuordnung der Customer-Klasse in der Beispieldatenbank Northwind enthält beispielsweise die folgende partielle Methode:

Partial Private Sub OnAddressChanged()
End Sub
partial void OnAddressChanged();

Sie können auch eine eigene Methode implementieren, indem Sie Code wie den folgenden in Ihre eigene partielle Customer-Klasse einfügen:

Partial Class Customer
    Private Sub OnAddressChanged()
        ' Insert business logic here.
    End Sub
End Class
public partial class Customer
{
    partial void OnAddressChanged();
    partial void OnAddressChanged()
    {
        // Insert business logic here.
    }
}

Dieser Ansatz wird normalerweise in LINQ to SQL verwendet, um Standardmethoden für Insert, Update und Delete zu überschreiben und Eigenschaften während der Lebenszyklusereignissen von Objekten zu validieren.

Weitere Informationen finden Sie unter Partielle Methoden (Visual Basic) oder partial (Methode) (C#).

Beispiel

Beschreibung

Das folgende Beispiel zeigt zunächst ExampleClass nach der möglichen Definition durch ein codeerzeugendes Tool wie SQLMetal. Anschließend wird gezeigt, wie Sie nur eine der beiden Methoden implementieren können.

Code

' Code-generating tool defines a partial class, including 
' two partial methods. 
Partial Class ExampleClass
    Partial Private Sub OnFindingMaxOutput()
    End Sub

    Partial Private Sub OnFindingMinOutput()
    End Sub

    Sub ExportResults()
        OnFindingMaxOutput()
        OnFindingMinOutput()
    End Sub
End Class

' Developer implements one of the partial methods. Compiler
' discards the other method.
Class ExampleClass
    Private Sub OnFindingMaxOutput()
        Console.WriteLine("Maximum has been found.")
    End Sub
End Class
// Code-generating tool defines a partial class, including
// two partial methods.
partial class ExampleClass
{
    partial void onFindingMaxOutput();
    partial void onFindingMinOutput();
}

// Developer implements one of the partial methods. Compiler
// discards the signature of the other method.
partial class ExampleClass
{
    partial void onFindingMaxOutput()
    {
        Console.WriteLine("Maximum has been found.");
    }
}

Beispiel

Beschreibung

Das folgende Beispiel verwendet die Beziehung zwischen der Shipper-Entität und der Order-Entität. Beachten Sie bei den Methoden die partielle InsertShipper-Methode und die partielle DeleteShipper-Methode. Diese Methoden überschreiben die standardmäßigen partiellen Methoden der LINQ to SQL-Zuordnung.

Code

Public Shared LoadOrdersCalled As Integer = 0
Private Function LoadOrders(ByVal shipper As Shipper) As  _
    IEnumerable(Of Order)
    LoadOrdersCalled += 1
    Return Me.Orders.Where(Function(o) o.ShipVia = _
        shipper.ShipperID)
End Function

Public Shared LoadShipperCalled As Integer = 0
Private Function LoadShipper(ByVal order As Order) As Shipper
    LoadShipperCalled += 1
    Return Me.Shippers.Single(Function(s) s.ShipperID = _
        order.ShipVia)
End Function

Public Shared InsertShipperCalled As Integer = 0
Private Sub InsertShipper(ByVal instance As Shipper)
    InsertShipperCalled += 1
    ' Call a Web service to perform an insert operation.
    InsertShipperService(shpr:=Nothing)
End Sub

Public Shared UpdateShipperCalled As Integer = 0
Private Sub UpdateShipper(ByVal original As Shipper, ByVal current _
    As Shipper)
    UpdateShipperCalled += 1
    ' Call a Web service to update shipper.
    InsertShipperService(shpr:=Nothing)
End Sub

Public Shared DeleteShipperCalled As Boolean
Private Sub DeleteShipper(ByVal instance As Shipper)
    DeleteShipperCalled = True
End Sub
public static int LoadOrdersCalled = 0;
private IEnumerable<Order> LoadOrders(Shipper shipper)
{
    LoadOrdersCalled++;
    return this.Orders.Where(o => o.ShipVia == shipper.ShipperID);
}

public static int LoadShipperCalled = 0;
private Shipper LoadShipper(Order order)
{
    LoadShipperCalled++;
    return this.Shippers.Single(s => s.ShipperID == order.ShipVia);
}

public static int InsertShipperCalled = 0;
partial void InsertShipper(Shipper shipper)
{
    InsertShipperCalled++;
    // Call a Web service to perform an insert operation.
    InsertShipperService(shipper);
}

public static int UpdateShipperCalled = 0;
private void UpdateShipper(Shipper original, Shipper current)
{
    Shipper shipper = new Shipper();
    UpdateShipperCalled++;
    // Call a Web service to update shipper.
    InsertShipperService(shipper);
}

public static bool DeleteShipperCalled;
partial void DeleteShipper(Shipper shipper)
{
    DeleteShipperCalled = true;
}

Siehe auch

Weitere Ressourcen

Vornehmen und Übergeben von Datenänderungen (LINQ to SQL)

Anpassen von Insert-, Update- und Delete-Operationen (LINQ to SQL)