Udostępnij za pośrednictwem


Dodawanie logiki biznesowej przy użyciu metod częściowych

Kod wygenerowany w języku Visual Basic i C# można dostosować w projektach LINQ to SQL przy użyciu metod częściowych. Kod generowany przez linQ to SQL definiuje podpisy jako jedną część metody częściowej. Jeśli chcesz zaimplementować metodę, możesz dodać własną metodę częściową. Jeśli nie dodasz własnej implementacji, kompilator odrzuci podpis metod częściowych i wywołuje domyślne metody w LINQ to SQL.

Uwaga

Jeśli używasz programu Visual Studio, możesz użyć Projektant obiektowych, aby dodać walidację i inne dostosowania do klas jednostek.

Na przykład domyślne mapowanie klasy Customer w przykładowej bazie danych Northwind obejmuje następującą metodę częściową:

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

Możesz zaimplementować własną metodę, dodając kod, taki jak następujący kod do własnej klasy częściowej Customer :

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

Takie podejście jest zwykle używane w linQ to SQL, aby zastąpić domyślne metody dla Insert, Update, Deletei do sprawdzania poprawności właściwości podczas zdarzeń cyklu życia obiektu.

Aby uzyskać więcej informacji, zobacz Metody częściowe (Visual Basic) lub partial (Method) (C# Reference) (C#).

Przykład 1

Poniższy przykład pokazuje ExampleClass najpierw, jak można go zdefiniować za pomocą narzędzia do generowania kodu, takiego jak SQLMetal, a następnie sposobu implementacji tylko jednej z dwóch metod.

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

Przykład 2

W poniższym przykładzie użyto relacji między jednostkami Shipper i Order . Zwróć uwagę na metody metody częściowe InsertShipper i DeleteShipper. Te metody zastępują domyślne metody częściowe dostarczane przez mapowanie LINQ to SQL.

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

Zobacz też