次の方法で共有


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

更新 : November 2007

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

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

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

LINQ to SQL オブジェクト モデル内の最も基本的な要素と、リレーショナル データ モデル内の要素との関係を、次の表に示します。

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

リレーショナル データ モデル

エンティティ クラス

テーブル

クラス メンバ

関連付け

外部キー リレーションシップ

メソッド

ストアド プロシージャまたは関数

Bb386989.alert_note(ja-jp,VS.90).gifメモ :

次の説明は、リレーショナル データ モデルと規則に関する基本的な知識があることが前提です。

LINQ to SQL エンティティ クラスおよびデータベース テーブル

LINQ to SQL では、データベース テーブルはエンティティ クラスで表されます。エンティティ クラスは、作成する他のクラスに似ていますが、クラスをデータベース テーブルに関連付ける特別な情報を使用して、クラスに注釈を付ける点が異なります。次の例に示すように、クラス宣言にカスタム属性 (TableAttribute) を追加することによって、この注釈を付けます。

<Table(Name:="Customers")> _
Public Class Customer
    Public CustomerID As String
    ' ...
    Public City As String
End Class
[Table(Name = "Customers")]
public class Customerzz
{
    public string CustomerID;
    // ...
    public string City;
}

テーブルとして宣言されたクラスのインスタンスのみ (つまり、エンティティ クラス)、データベースに保存できます。

詳細については、「属性ベースの対応付け (LINQ to SQL)」の「Table Attribute」セクションを参照してください。

LINQ to SQL クラス メンバおよびデータベース列

クラスとテーブルの関連付けに加えて、フィールドまたはプロパティを設定してデータベース列を表すことができます。このためには、LINQ to SQL は、次の例に示すように ColumnAttribute 属性を定義します。

<Table(Name:="Customers")> _
Public Class Customer
    <Column(IsPrimaryKey:=True)> _
    Public CustomerID As String

    <Column()> _
    Public City As String
End Class
[Table(Name = "Customers")]
public class Customer
{
    [Column(IsPrimaryKey = true)]
    public string CustomerID;
    [Column]
    public string City;
}

列に対応付けられたフィールドおよびプロパティのみ、データベースに保持したり、データベースから取得できます。列として宣言されていないものは、アプリケーション ロジックの一時的な部分と見なされます。

ColumnAttribute 属性にはさまざまなプロパティがあり、これを使用することで、列を表すメンバをカスタマイズできます (たとえば、主キー列を表すメンバを指定できます)。詳細については、「属性ベースの対応付け (LINQ to SQL)」の「Column Attribute」セクションを参照してください。

LINQ to SQL の関連付けおよびデータベースの外部キー リレーションシップ

LINQ to SQL では、AssociationAttribute 属性を適用することによって、データベースの関連付け (外部キーと主キーのリレーションシップなど) を表します。次のコード セグメントでは、Order クラスに Customer プロパティが含まれ、このプロパティが AssociationAttribute 属性を持ちます。このプロパティとその属性が、Order クラスおよび Customer クラスとのリレーションシップを提供します。

Order クラスの 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
 [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");
            }
        }
    }

詳細については、「属性ベースの対応付け (LINQ to SQL)」の「Association Attribute」セクションを参照してください。

LINQ to SQL メソッドおよびデータベース ストアド プロシージャ

LINQ to SQL は、ストアド プロシージャとユーザー定義関数をサポートしています。LINQ to SQL では、これらのデータベース定義の概念をクライアント オブジェクトに対応付けることによって、クライアント コードから厳密に型指定された方法でのアクセスを実現しています。メソッド シグネチャは、データベース内で定義されているプロシージャおよび関数のシグネチャと可能な限りよく似ています。IntelliSense を使用して、これらのメソッドを見つけることができます。

呼び出しによって対応するプロシージャに返される結果セットは、厳密に型指定されたコレクションです。

LINQ to SQL は、FunctionAttribute 属性と ParameterAttribute 属性を使用して、ストアド プロシージャおよび関数をメソッドに対応付けます。ストアド プロシージャを表すメソッドは、IsComposable プロパティによって、ユーザー定義関数を表すメソッドと区別されます。このプロパティが false (既定値) に設定されている場合、メソッドはストアド プロシージャを表します。true に設定されている場合、メソッドはデータベース関数を表します。

Bb386989.alert_note(ja-jp,VS.90).gifメモ :

Visual Studio を使用している場合は、オブジェクト リレーショナル デザイナを使用して、ストアド プロシージャおよびユーザー定義関数に対応付けられるメソッドを作成できます。

   ' 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
    // 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));
    }

詳細については、「属性ベースの対応付け (LINQ to SQL)」および「ストアド プロシージャ (LINQ to SQL)」の「Function Attribute」、「Stored Procedure Attribute」、「Parameter Attribute」の各セクションを参照してください。

参照

参照

属性ベースの対応付け (LINQ to SQL)

その他の技術情報

背景情報 (LINQ to SQL)