部分メソッドを使用してビジネス ロジックを追加する
生成された Visual Basic および C# のコードは、"部分メソッド" を使用して LINQ to SQL プロジェクトでカスタマイズできます。 LINQ to SQL から生成されるコードでは、シグネチャが部分メソッドの一部として定義されています。 このメソッドを実装する場合に、独自の部分メソッドを追加できます。 独自の実装を追加しない場合は、コンパイラで部分メソッドのシグネチャが破棄され、既定のメソッドが LINQ to SQL で呼び出されます。
Note
Visual Studio を使用している場合は、オブジェクト リレーショナル デザイナーを使用して、妥当性検査やその他のカスタマイズをエンティティ クラスに追加できます。
たとえば、Northwind サンプル データベースの Customer
クラスに対する既定の対応付けには次の部分メソッドが含まれます。
partial void OnAddressChanged();
Partial Private Sub OnAddressChanged()
End Sub
次のようなコードを独自の部分 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
この方法は、Insert
、Update
、Delete
の既定のメソッドをオーバーライドし、オブジェクトのライフサイクル イベントの発生時にプロパティを検証するために、LINQ to SQL で一般的に使用されます。
詳細については、「部分メソッド」(Visual Basic) または「partial (メソッド) (C# リファレンス)」(C#) を参照してください。
例 1
次の例では、SQLMetal などのコード生成ツールによって定義される ExampleClass
を最初に示し、次に 2 つのメソッドの 1 つだけを実装できることを示します。
// 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
例 2
次の例では、Shipper
エンティティと Order
エンティティのリレーションシップを使用します。 メソッドには部分メソッドの InsertShipper
と DeleteShipper
が含まれています。 これらのメソッドは、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