このチュートリアルでは、LINQ to SQL の 関連付けを 使用して、データベース内の外部キーリレーションシップを表す方法について説明します。
注
次の手順では、一部の Visual Studio ユーザー インターフェイス要素の名前や場所がコンピューターに異なる場合があります。 これらの要素は、使用している Visual Studio エディションと使用する設定によって決まります。 詳細については、「IDEのカスタマイズ」を参照してください。
このチュートリアルは、Visual Basic 開発設定を使用して作成されました。
[前提条件]
「チュートリアル: 単純なオブジェクト モデルとクエリ (Visual Basic)」を完了している必要があります。 このチュートリアルは、c:\linqtest にnorthwnd.mdf ファイルが存在することを含め、そのチュートリアルに基づいています。
概要
このチュートリアルは、次の 3 つの主要なタスクで構成されています。
サンプル Northwind データベースの Orders テーブルを表すエンティティ クラスを追加します。
Customer
クラスとCustomer
クラス間の関係を強化するために、Order
クラスに注釈を追加する。Order
クラスを使用してCustomer
情報を取得するプロセスをテストするクエリの作成と実行。
テーブル間のリレーションシップのマッピング
Customer
クラス定義の後に、次のコードを含むOrder
エンティティ クラス定義を作成します。これは、Orders.Customer
がCustomers.CustomerID
の外部キーとして関連付けられていることを示します。
Order エンティティ クラスを追加するには
Customer
クラスの後に次のコードを入力するか貼り付けます。<Table(Name:="Orders")> _ Public Class Order Private _OrderID As Integer Private _CustomerID As String Private _Customers As EntityRef(Of Customer) Public Sub New() Me._Customers = New EntityRef(Of Customer)() End Sub <Column(Storage:="_OrderID", DbType:="Int NOT NULL IDENTITY", _ IsPrimaryKey:=True, IsDBGenerated:=True)> _ Public ReadOnly Property OrderID() As Integer Get Return Me._OrderID End Get End Property ' No need to specify a setter because IsDBGenerated is true. <Column(Storage:="_CustomerID", DbType:="NChar(5)")> _ Public Property CustomerID() As String Get Return Me._CustomerID End Get Set(ByVal value As String) Me._CustomerID = value End Set End Property <Association(Storage:="_Customers", ThisKey:="CustomerID")> _ Public Property Customers() As Customer Get Return Me._Customers.Entity End Get Set(ByVal value As Customer) Me._Customers.Entity = value End Set End Property End Class
Customer クラスに注釈を付ける
この手順では、 Customer
クラスに注釈を付けて、 Order
クラスとの関係を示します。 (リンクを作成するには、どちらの方向でもリレーションシップを定義するだけで十分であるため、この追加は厳密には必要ありません。ただし、この注釈を追加すると、オブジェクトを双方向に簡単に移動できます)。
Customer クラスに注釈を付けるために
次のコードを入力するか、
Customer
クラスに貼り付けます。Private _Orders As EntitySet(Of Order) Public Sub New() Me._Orders = New EntitySet(Of Order)() End Sub <Association(Storage:="_Orders", OtherKey:="CustomerID")> _ Public Property Orders() As EntitySet(Of Order) Get Return Me._Orders End Get Set(ByVal value As EntitySet(Of Order)) Me._Orders.Assign(value) End Set End Property
Customer-Order リレーションシップ全体でのクエリの作成と実行
Order
オブジェクトから直接、または逆の順序でCustomer
オブジェクトにアクセスできるようになりました。 顧客と注文の間に明示的な 結合 は必要ありません。
Order オブジェクトにアクセスするには、Customer オブジェクトを使用します。
次のコードを入力するか、メソッドに貼り付けて、
Sub Main
メソッドを変更します。' Query for customers who have no orders. Dim custQuery = _ From cust In Customers _ Where Not cust.Orders.Any() _ Select cust Dim msg As String = "", title As String = _ "Customers With No Orders", response As MsgBoxResult, _ style As MsgBoxStyle = MsgBoxStyle.Information For Each custObj In custQuery msg &= String.Format(custObj.CustomerID & vbCrLf) Next response = MsgBox(msg, style, title)
F5 キーを押してアプリケーションをデバッグします。
メッセージ ボックスに 2 つの名前が表示され、[コンソール] ウィンドウに生成された SQL コードが表示されます。
メッセージ ボックスを閉じてデバッグを停止します。
データベースの厳密に型指定されたビューを作成する
データベースの厳密に型指定されたビューから始める方がはるかに簡単です。 DataContext オブジェクトを厳密に入力することで、GetTableの呼び出しは必要ありません。 厳密に型指定された DataContext オブジェクトを使用する場合は、すべてのクエリで厳密に型指定されたテーブルを使用できます。
次の手順では、データベースの Customers テーブルにマップする厳密に型指定されたテーブルとして Customers
を作成します。
DataContext オブジェクトを厳密に型指定するには
Customer
クラス宣言の上に次のコードを追加します。Public Class Northwind Inherits DataContext ' Table(Of T) abstracts database details per ' table/data type. Public Customers As Table(Of Customer) Public Orders As Table(Of Order) Public Sub New(ByVal connection As String) MyBase.New(connection) End Sub End Class
厳密に型指定された
Sub Main
を次のように使用するようにDataContextを変更します。' Use a connection string. Dim db As New Northwind _ ("C:\linqtest\northwnd.mdf") ' Query for customers from Seattle. Dim custs = _ From cust In db.Customers _ Where cust.City = "Seattle" _ Select cust For Each custObj In custs Console.WriteLine("ID=" & custObj.CustomerID) Next ' Freeze the console window. Console.ReadLine()
F5 キーを押してアプリケーションをデバッグします。
コンソール ウィンドウの出力は次のとおりです。
ID=WHITC
コンソール ウィンドウで Enter キーを押して、アプリケーションを閉じます。
このアプリケーションを保存する場合は、[ ファイル ] メニュー の [すべて保存 ] をクリックします。
次のステップ
次のチュートリアル (チュートリアル: データの操作 (Visual Basic)) では、データを操作する方法を示します。 このチュートリアルでは、既に完了しているこのシリーズの 2 つのチュートリアルを保存する必要はありません。