LINQ to SQL オブジェクト モデル

LINQ to SQL では、開発者のプログラミング言語で表されるオブジェクト モデルが、リレーショナル データベースのデータ モデルに対応付けられています。 データ操作はオブジェクト モデルに従って行われます。

このシナリオでは、データベースに対してデータベース コマンド (INSERT など) を実行する必要はありません。 代わりに、オブジェクト モデル内で値を変更し、メソッドを実行します。 データベースに対してクエリを実行したり、変更を送信する必要がある場合、LINQ to SQL は、要求を正しい SQL コマンドに変換し、そのコマンドをデータベースに送信します。

Screenshot that shows the Linq Object Model.

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

詳しくは、「属性ベースの対応付け」の関数属性、ストアド プロシージャ属性、パラメーター属性の各セクション、および「ストアド プロシージャ」をご覧ください。

関連項目