Condividi tramite


Aggiunta della logica di business utilizzando i metodi parziali (LINQ to SQL)

È possibile personalizzare Visual Basic e il codice C# generato nei progetti di LINQ to SQL utilizzando metodi parziali. Il codice generato da LINQ to SQL definisce le firme come una parte di un metodo parziale. Se si desidera implementare il metodo, è possibile aggiungere un metodo parziale personalizzato. Se non si aggiunge un'implementazione personalizzata, il compilatore ignora la firma dei metodi parziali e chiama i metodi predefiniti in LINQ to SQL.

NotaNota

Se si utilizza Visual Studio, è possibile utilizzare la Object Relational Designer per aggiungere la convalida e altre personalizzazioni alle classi di entità.

Ad esempio, il mapping predefinito per la classe Customer nel database di esempio Northwind include il seguente metodo parziale:

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

È possibile implementare un metodo personalizzato aggiungendo codice analogo al seguente alla classe parziale personalizzata Customer:

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

Questo approccio viene utilizzato in genere in LINQ to SQL per eseguire l'override dei metodi predefiniti per Insert, Update, Delete e per convalidare le proprietà durante gli eventi del ciclo di vita dell'oggetto.

Per ulteriori informazioni, vedere Partial Methods (Visual Basic) o parziale (Metodo) (C#).

Esempio

Descrizione

Nell'esempio riportato di seguito viene illustrato innanzitutto come definire ExampleClass utilizzando uno strumento per la generazione di codice quale SQLMetal, quindi come è possibile implementare solo uno dei due metodi.

Codice

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

Esempio

Descrizione

Nell'esempio riportato di seguito viene utilizzata la relazione tra le entità Shipper e Order. Notare fra i metodi i metodi parziali InsertShipper e DeleteShipper. Questi metodi eseguono l'override dei metodi parziali predefiniti forniti dal mapping di LINQ to SQL.

Codice

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

Vedere anche

Altre risorse

Scrittura e invio di modifiche di dati (LINQ to SQL)

Personalizzazione delle operazioni Insert, Update e Delete (LINQ to SQL)