次の方法で共有


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

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

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

Linq オブジェクト モデルを示すスクリーンショット。

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 マッピング およびストアド プロシージャ」の「関数属性、ストアド プロシージャ属性、およびパラメーター属性」セクションを参照してください。

こちらも参照ください