LINQ to SQL では、開発者のプログラミング言語で表現されたオブジェクト モデルがリレーショナル データベースのデータ モデルにマップされます。 データに対する操作は、オブジェクト モデルに従って実行されます。
このシナリオでは、データベースにデータベース コマンド (たとえば、 INSERT
) を発行しません。 代わりに、値を変更し、オブジェクト モデル内でメソッドを実行します。 データベースに対してクエリを実行したり、変更を送信したりする場合、LINQ to SQL は要求を正しい SQL コマンドに変換し、それらのコマンドをデータベースに送信します。
LINQ to SQL オブジェクト モデルの最も基本的な要素と、リレーショナル データ モデルの要素との関係を次の表にまとめます。
LINQ to SQL オブジェクト モデル | リレーショナル データ モデル |
---|---|
エンティティ クラス | 表 |
クラス メンバー | コラム |
関連付け | 外部キーリレーションシップ |
メソッド | ストアド プロシージャまたは関数 |
注
次の説明では、リレーショナル データ モデルとルールに関する基本的な知識があることを前提としています。
LINQ to SQL エンティティ クラスとデータベース テーブル
LINQ to SQL では、データベース テーブルは エンティティ クラスによって表されます。 エンティティ クラスは、クラスをデータベース テーブルに関連付ける特別な情報を使用してクラスに注釈を付ける点を除き、作成する他のクラスと似ています。 この注釈を作成するには、次の例のように、クラス宣言にカスタム属性 (TableAttribute) を追加します。
例
[Table(Name = "Customers")]
public class Customerzz
{
public string CustomerID;
// ...
public string City;
}
<Table(Name:="Customers")> _
Public Class Customer
Public CustomerID As String
' ...
Public City As String
End Class
テーブルとして宣言されたクラスのインスタンス (つまり、エンティティ クラス) のみをデータベースに保存できます。
詳細については、「 Attribute-Based マッピング」の「テーブル属性」セクションを参照してください。
LINQ to SQL のクラス メンバーとデータベース列
クラスをテーブルに関連付けるだけでなく、データベース列を表すフィールドまたはプロパティを指定します。 このため、LINQ to SQL では、次の例のように、 ColumnAttribute 属性を定義します。
例
[Table(Name = "Customers")]
public class Customer
{
[Column(IsPrimaryKey = true)]
public string CustomerID;
[Column]
public string City;
}
<Table(Name:="Customers")> _
Public Class Customer
<Column(IsPrimaryKey:=True)> _
Public CustomerID As String
<Column()> _
Public City As String
End Class
列にマップされたフィールドとプロパティのみが、データベースに保存されるか、データベースから取得されます。 列として宣言されていないものは、アプリケーション ロジックの一時的な部分と見なされます。
ColumnAttribute属性には、列を表すこれらのメンバーをカスタマイズするために使用できるさまざまなプロパティがあります (主キー列を表すメンバーを指定するなど)。 詳細については、「 Attribute-Based マッピング」の「列属性」セクションを参照してください。
LINQ to SQL の関連付けとデータベースの外部キーリレーションシップ
LINQ to SQL では、 AssociationAttribute 属性を適用して、データベースの関連付け (外部キーと主キーのリレーションシップなど) を表します。 次のコード セグメントでは、Order
クラスに、Customer
属性を持つAssociationAttribute プロパティが含まれています。 このプロパティとその属性は、Order
クラスとのリレーションシップを持つCustomer
クラスを提供します。
次のコード例は、Customer
クラスのOrder
プロパティを示しています。
例
[Association(Name="FK_Orders_Customers", Storage="_Customer", ThisKey="CustomerID", IsForeignKey=true)]
public Customer Customer
{
get
{
return this._Customer.Entity;
}
set
{
Customer previousValue = this._Customer.Entity;
if (((previousValue != value)
|| (this._Customer.HasLoadedOrAssignedValue == false)))
{
this.SendPropertyChanging();
if ((previousValue != null))
{
this._Customer.Entity = null;
previousValue.Orders.Remove(this);
}
this._Customer.Entity = value;
if ((value != null))
{
value.Orders.Add(this);
this._CustomerID = value.CustomerID;
}
else
{
this._CustomerID = default(string);
}
this.SendPropertyChanged("Customer");
}
}
}
<Association(Name:="FK_Orders_Customers", Storage:="_Customer", ThisKey:="CustomerID", IsForeignKey:=true)> _
Public Property Customer() As Customer
Get
Return Me._Customer.Entity
End Get
Set
Dim previousValue As Customer = Me._Customer.Entity
If (((previousValue Is value) _
= false) _
OrElse (Me._Customer.HasLoadedOrAssignedValue = false)) Then
Me.SendPropertyChanging
If ((previousValue Is Nothing) _
= false) Then
Me._Customer.Entity = Nothing
previousValue.Orders.Remove(Me)
End If
Me._Customer.Entity = value
If ((value Is Nothing) _
= false) Then
value.Orders.Add(Me)
Me._CustomerID = value.CustomerID
Else
Me._CustomerID = CType(Nothing, String)
End If
Me.SendPropertyChanged("Customer")
End If
End Set
End Property
詳細については、「 Attribute-Based マッピング」の「関連付け属性」セクションを参照してください。
LINQ to SQL メソッドとデータベース ストアド プロシージャ
LINQ to SQL では、ストアド プロシージャとユーザー定義関数がサポートされます。 LINQ to SQL では、これらのデータベース定義の抽象化をクライアント オブジェクトにマップして、クライアント コードから厳密に型指定された方法でアクセスできるようにします。 メソッドシグネチャは、データベースで定義されているプロシージャと関数のシグネチャとできるだけよく似ています。 IntelliSense を使用して、これらのメソッドを検出できます。
マップされたプロシージャの呼び出しによって返される結果セットは、厳密に型指定されたコレクションです。
LINQ to SQL では、 FunctionAttribute 属性と ParameterAttribute 属性を使用して、ストアド プロシージャと関数をメソッドにマップします。 ストアド プロシージャを表すメソッドは、 IsComposable プロパティによってユーザー定義関数を表すメソッドと区別されます。 このプロパティが false
(既定値) に設定されている場合、メソッドはストアド プロシージャを表します。
true
に設定されている場合、メソッドはデータベース関数を表します。
注
Visual Studio を使用している場合は、オブジェクト リレーショナル デザイナーを使用して、ストアド プロシージャとユーザー定義関数にマップされたメソッドを作成できます。
例
// This is an example of a stored procedure in the Northwind
// sample database. The IsComposable property defaults to false.
[Function(Name="dbo.CustOrderHist")]
public ISingleResult<CustOrderHistResult> CustOrderHist([Parameter(Name="CustomerID", DbType="NChar(5)")] string customerID)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), customerID);
return ((ISingleResult<CustOrderHistResult>)(result.ReturnValue));
}
' This is an example of a stored procedure in the Northwind
' sample database. The IsComposable property defaults to false.
<FunctionAttribute(Name:="dbo.CustOrderHist")> _
Public Function CustOrderHist(<Parameter(Name:="CustomerID", DbType:="NChar(5)")> ByVal customerID As String) As ISingleResult(Of CustOrderHistResult)
Dim result As IExecuteResult = Me.ExecuteMethodCall(Me, CType(MethodInfo.GetCurrentMethod, MethodInfo), customerID)
Return CType(result.ReturnValue, ISingleResult(Of CustOrderHistResult))
End Function
詳細については、「 Attribute-Based マッピング およびストアド プロシージャ」の「関数属性、ストアド プロシージャ属性、およびパラメーター属性」セクションを参照してください。