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
Association 외래 키 관계
메서드 저장 프로시저 또는 함수

참고 항목

지금부터는 관계형 데이터 모델과 규칙에 대해 어느 정도 지식이 있다고 가정하고 설명합니다.

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 특성을 적용하여 데이터베이스 연결(예: 외래 키 대 기본 키 관계)을 나타냅니다. 다음 코드 세그먼트에서 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

자세한 내용은 특성 기반 매핑의 연결 특성 섹션을 참조하세요.

LINQ to SQL 메서드 및 데이터베이스 저장 프로시저

LINQ to SQL은 저장 프로시저와 사용자 정의 함수를 지원합니다. LINQ to SQL에서 이러한 데이터베이스 정의 추상화를 클라이언트 개체에 매핑하면 클라이언트 코드에서 강력한 형식으로 해당 개체에 액세스할 수 있습니다. 메서드 시그니처는 데이터베이스에 정의된 프로시저 및 함수의 시그니처와 매우 유사합니다. IntelliSense를 사용하여 이러한 메서드를 검색할 수 있습니다.

매핑된 프로시저에 대한 호출에서 반환되는 결과 집합은 강력한 형식의 컬렉션입니다.

LINQ to SQL은 FunctionAttributeParameterAttribute 특성을 사용하여 저장 프로시저와 함수를 메서드에 매핑합니다. 저장 프로시저를 나타내는 메서드와 사용자 정의 함수를 나타내는 메서드는 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

자세한 내용은 특성 기반 매핑저장 프로시저의 함수 특성, 저장 프로시저 특성 및 매개 변수 특성 섹션을 참조하세요.

참고 항목