次の方法で共有


部分メソッドによるビジネス ロジックの追加 (LINQ to SQL)

生成された Visual Basic および C# のコードは、部分メソッドを使用して LINQ to SQL プロジェクトでカスタマイズできます。 LINQ to SQL から生成されるコードでは、シグネチャが部分メソッドの一部として定義されています。 このメソッドを実装する場合に、独自の部分メソッドを追加できます。 独自の実装を追加しない場合は、コンパイラで部分メソッドのシグネチャが破棄され、既定のメソッドが LINQ to SQL で呼び出されます。

メモメモ

Visual Studio を使用している場合は、オブジェクト リレーショナル デザイナーを使用して、妥当性検査やその他のカスタマイズをエンティティ クラスに追加できます。

たとえば、Northwind サンプル データベースの Customer クラスに対する既定の対応付けには次の部分メソッドが含まれます。

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

次のようなコードを独自の部分 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.
    }
}

この方法は、Insert、Update、および Delete の既定のメソッドをオーバーライドし、オブジェクトのライフ サイクル イベントの発生時にプロパティを検証するために、LINQ to SQL で一般的に使用されます。

詳細については、「部分メソッド (Visual Basic)」(Visual Basic) または「partial (メソッド)」(C#) を参照してください。

説明

次の例では、SQLMetal などのコード生成ツールによって定義される ExampleClass を最初に示し、次に 2 つのメソッドの 1 つだけを実装できることを示します。

コード

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

説明

次の例では、Shipper エンティティと Order エンティティのリレーションシップを使用します。 メソッドには部分メソッドの InsertShipper と DeleteShipper が含まれています。 これらのメソッドは、LINQ to SQL の対応付けによって提供される既定の部分メソッドをオーバーライドします。

コード

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

参照

その他の技術情報

データの変更と変更の送信 (LINQ to SQL)

挿入、更新、および削除の各操作のカスタマイズ (LINQ to SQL)