LINQ to SQL オブジェクト モデル
LINQ to SQL では、開発者のプログラミング言語で表されるオブジェクト モデルが、リレーショナル データベースのデータ モデルに対応付けられています。 データ操作はオブジェクト モデルに従って行われます。
このシナリオでは、データベースに対してデータベース コマンド (INSERT
など) を実行する必要はありません。 代わりに、オブジェクト モデル内で値を変更し、メソッドを実行します。 データベースに対してクエリを実行したり、変更を送信する必要がある場合、LINQ to SQL は、要求を正しい SQL コマンドに変換し、そのコマンドをデータベースに送信します。
LINQ to SQL オブジェクト モデル内の最も基本的な要素と、リレーショナル データ モデル内の要素との関係を、次の表に示します。
LINQ to SQL オブジェクト モデル | リレーショナル データ モデル |
---|---|
エンティティ クラス | テーブル |
クラス メンバー | Column |
関連付け | 外部キー リレーションシップ |
メソッド | ストアド プロシージャまたは関数 |
Note
次の説明は、リレーショナル データ モデルと規則に関する基本的な知識があることが前提です。
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
テーブルとして宣言されたクラスのインスタンスのみ (つまり、エンティティ クラス)、データベースに保存できます。
詳しくは、「属性ベースの対応付け」のテーブル属性のセクションをご覧ください。
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 属性にはさまざまなプロパティがあり、これを使用することで、列を表すメンバーをカスタマイズできます (たとえば、主キー列を表すメンバーを指定できます)。 詳しくは、「属性ベースの対応付け」の列属性のセクションをご覧ください。
LINQ to SQL の関連付けおよびデータベースの外部キー リレーションシップ
LINQ to SQL では、AssociationAttribute 属性を適用することによって、データベースの関連付け (外部キーと主キーのリレーションシップなど) を表します。 次のコード セグメントでは、AssociationAttribute 属性を持つ Customer
プロパティが Order
クラスに含まれています。 このプロパティとその属性が、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
詳しくは、「属性ベースの対応付け」の関連付け属性のセクションをご覧ください。
LINQ to SQL メソッドおよびデータベース ストアド プロシージャ
LINQ to SQL は、ストアド プロシージャとユーザー定義関数をサポートしています。 LINQ to SQL では、これらのデータベース定義の概念をクライアント オブジェクトに対応付けることによって、クライアント コードから厳密に型指定された方法でのアクセスが実現されます。 メソッド シグネチャは、データベース内で定義されているプロシージャおよび関数のシグネチャと可能な限りよく似ています。 IntelliSense を使用して、これらのメソッドを見つけることができます。
呼び出しによって対応するプロシージャに返される結果セットは、厳密に型指定されたコレクションです。
LINQ to SQL は、FunctionAttribute 属性と ParameterAttribute 属性を使用して、ストアド プロシージャおよび関数をメソッドに対応付けます。 ストアド プロシージャを表すメソッドは、IsComposable プロパティによって、ユーザー定義関数を表すメソッドと区別されます。 このプロパティが false
(既定値) に設定されている場合、メソッドはストアド プロシージャを表します。 true
に設定されている場合、メソッドはデータベース関数を表します。
Note
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
詳しくは、「属性ベースの対応付け」の関数属性、ストアド プロシージャ属性、パラメーター属性の各セクション、および「ストアド プロシージャ」をご覧ください。