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 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 매핑 및 저장 프로시저의 함수 특성, 저장 프로시저 특성 및 매개 변수 특성 섹션을 참조하세요.