LINQ to SQL 개체 모델
업데이트: November 2007
LINQ to SQL에서 개발자의 프로그래밍 언어로 표현된 개체 모델은 관계형 데이터베이스의 데이터 모델에 매핑됩니다. 그런 다음 개체 모델에 따라 데이터 작업이 수행됩니다.
이 시나리오에서는 데이터베이스에 대해 INSERT와 같은 데이터베이스 명령을 실행하지 않습니다. 대신 개체 모델 내에서 값을 변경하고 메서드를 실행합니다. 데이터베이스를 쿼리하거나 데이터베이스에 변경 내용을 보내려는 경우 LINQ to SQL은 사용자의 요청을 올바른 SQL 명령으로 변환하고 이러한 명령을 데이터베이스에 보냅니다.
LINQ to SQL 개체 모델의 가장 기본적인 요소와 관계형 데이터 모델의 요소 간의 관계가 다음 표에 요약되어 있습니다.
LINQ to SQL 개체 모델 |
관계형 데이터 모델 |
---|---|
엔터티 클래스 |
테이블 |
클래스 멤버 |
열 |
연결 |
외래 키 관계 |
메서드 |
저장 프로시저 또는 함수 |
참고: |
---|
지금부터는 관계형 데이터 모델과 규칙에 대해 어느 정도 지식이 있다고 가정하고 설명합니다. |
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)의 테이블 특성 단원을 참조하십시오.
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)의 열 특성 단원을 참조하십시오.
LINQ to SQL 연결 및 데이터베이스 외래 키 관계
LINQ to SQL에서는 AssociationAttribute 특성을 적용하여 외래 키와 기본 키 사이의 관계와 같은 데이터베이스 연결을 나타냅니다. 다음 코드 세그먼트에서 Order 클래스는 AssociationAttribute 특성이 있는 Customer 속성을 포함합니다. 이 속성과 해당 특성은 Customer 클래스에 Order 클래스와의 관계를 제공합니다.
다음 코드 예제에서는 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 특성 단원을 참조하십시오.
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.
<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)의 함수 특성, 저장 프로시저 특성 및 매개 변수 특성 단원을 참조하십시오.