Partilhar via


Adicionar lógica de negócios usando métodos parciais

Você pode personalizar o código gerado em Visual Basic e C# em seus projetos LINQ to SQL usando métodos parciais. O código que o LINQ to SQL gera define assinaturas como uma parte de um método parcial. Se você quiser implementar o método, você pode adicionar seu próprio método parcial. Se você não adicionar sua própria implementação, o compilador descartará a assinatura de métodos parciais e chamará os métodos padrão em LINQ to SQL.

Nota

Se você estiver usando o Visual Studio, poderá usar o Object Relational Designer para adicionar validação e outras personalizações a classes de entidade.

Por exemplo, o mapeamento padrão para a Customer classe no banco de dados de exemplo Northwind inclui o seguinte método parcial:

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

Você pode implementar seu próprio método adicionando código como o seguinte à sua própria classe parcial 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

Essa abordagem é normalmente usada no LINQ to SQL para substituir métodos padrão para Insert, Update, Deletee para validar propriedades durante eventos do ciclo de vida do objeto.

Para obter mais informações, consulte Métodos parciais (Visual Basic) ou parciais (Método) (Referência C#) (C#).

Exemplo 1

O exemplo a seguir mostra ExampleClass primeiro como ele pode ser definido por uma ferramenta de geração de código, como SQLMetal, e, em seguida, como você pode implementar apenas um dos dois métodos.

// 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

Exemplo 2

O exemplo a seguir usa a relação entre Shipper e Order entidades. Observe entre os métodos os métodos parciais, InsertShipper e DeleteShipper. Esses métodos substituem os métodos parciais padrão fornecidos pelo mapeamento 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

Consulte também