연습: 관계 간 쿼리(Visual Basic)
이 연습에서는 LINQ to SQL 연결을 사용하여 데이터베이스의 외래 키 관계를 나타내는 방법을 보여 줍니다.
참고 항목
일부 Visual Studio 사용자 인터페이스 요소의 경우 다음 지침에 설명된 것과 다른 이름 또는 위치가 시스템에 표시될 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 IDE 개인 설정을 참조하세요.
이 연습은 Visual Basic 개발 설정을 사용하여 작성했습니다.
필수 조건
연습: 단순 개체 모델 및 쿼리(Visual Basic)를 완료해야 합니다. 이 연습은 c:\linqtest에 있는 northwnd.mdf 파일을 비롯하여 해당 연습의 단순 개체 모델 및 쿼리를 기반으로 합니다.
개요
이 연습은 다음과 같은 세 가지 주요 작업으로 구성됩니다.
Northwind 샘플 데이터베이스의 Orders 테이블을 나타내는 엔터티 클래스 추가
Customer
및Customer
클래스 간의 관계를 향상시키기 위해Order
클래스에 주석 추가Order
클래스를 사용하여Customer
정보를 가져오는 과정을 테스트하는 쿼리 만들기 및 실행
테이블 간 관계 매핑
Customer
클래스 정의 후에 Order
가 외래 키로 Orders.Customer
에 관련된다는 것을 나타내는 다음 코드가 포함된 Customers.CustomerID
엔터티 클래스 정의를 만듭니다.
Order 엔터티 클래스를 추가하려면
Customer
클래스 뒤에 다음 코드를 입력하거나 붙여넣습니다.<Table(Name:="Orders")> _ Public Class Order Private _OrderID As Integer Private _CustomerID As String Private _Customers As EntityRef(Of Customer) Public Sub New() Me._Customers = New EntityRef(Of Customer)() End Sub <Column(Storage:="_OrderID", DbType:="Int NOT NULL IDENTITY", _ IsPrimaryKey:=True, IsDBGenerated:=True)> _ Public ReadOnly Property OrderID() As Integer Get Return Me._OrderID End Get End Property ' No need to specify a setter because IsDBGenerated is true. <Column(Storage:="_CustomerID", DbType:="NChar(5)")> _ Public Property CustomerID() As String Get Return Me._CustomerID End Get Set(ByVal value As String) Me._CustomerID = value End Set End Property <Association(Storage:="_Customers", ThisKey:="CustomerID")> _ Public Property Customers() As Customer Get Return Me._Customers.Entity End Get Set(ByVal value As Customer) Me._Customers.Entity = value End Set End Property End Class
Customer 클래스에 주석 지정
이 단계에서는 Customer
클래스에 대한 관계를 나타내기 위해 Order
클래스에 주석을 지정합니다. (어느 방향으로든 관계를 정의하면 링크를 만들기에 충분하기 때문에 이 추가가 꼭 필요한 것은 아닙니다. 그러나 이 주석을 추가하면 어느 방향으로든 개체를 쉽게 탐색할 수 있습니다.)
Customer 클래스에 주석을 달려면
Customer
클래스에 다음 코드를 입력하거나 붙여넣습니다.Private _Orders As EntitySet(Of Order) Public Sub New() Me._Orders = New EntitySet(Of Order)() End Sub <Association(Storage:="_Orders", OtherKey:="CustomerID")> _ Public Property Orders() As EntitySet(Of Order) Get Return Me._Orders End Get Set(ByVal value As EntitySet(Of Order)) Me._Orders.Assign(value) End Set End Property
Customer 및 Order 관계에서 쿼리 만들기 및 실행
이제 Order
개체에서 Customer
개체를 직접 액세스하거나 그 반대 방향으로 액세스할 수 있습니다. 고객과 주문 간에 명시적인 조인이 필요하지 않습니다.
Customer 개체를 사용하여 Order 개체에 액세스하려면
다음 코드를
Sub Main
메서드에 입력하거나 붙여넣어 이 메서드를 수정합니다.' Query for customers who have no orders. Dim custQuery = _ From cust In Customers _ Where Not cust.Orders.Any() _ Select cust Dim msg As String = "", title As String = _ "Customers With No Orders", response As MsgBoxResult, _ style As MsgBoxStyle = MsgBoxStyle.Information For Each custObj In custQuery msg &= String.Format(custObj.CustomerID & vbCrLf) Next response = MsgBox(msg, style, title)
F5 키를 눌러 애플리케이션을 디버깅합니다.
두 이름이 메시지 상자에 표시되며 콘솔 창에는 생성된 SQL 코드가 표시됩니다.
메시지 상자를 닫아 디버깅을 중지합니다.
강력한 형식의 데이터베이스 뷰 만들기
강력한 형식의 데이터베이스 뷰로 작업을 시작하는 것이 훨씬 더 쉽습니다. DataContext 개체를 강력한 형식으로 설정하면 GetTable 호출이 필요하지 않습니다. 강력한 형식의 DataContext 개체를 사용할 경우 모든 쿼리에서 강력한 형식의 테이블을 사용할 수 있습니다.
다음 단계에서는 Customers
를 데이터베이스의 Customers 테이블에 매핑되는 강력한 형식의 테이블로 만듭니다.
DataContext 개체를 강력한 형식으로 설정하려면
Customer
클래스 선언 위에 다음 코드를 추가합니다.Public Class Northwind Inherits DataContext ' Table(Of T) abstracts database details per ' table/data type. Public Customers As Table(Of Customer) Public Orders As Table(Of Order) Public Sub New(ByVal connection As String) MyBase.New(connection) End Sub End Class
다음과 같이 강력한 형식의
Sub Main
를 사용하도록 DataContext을 수정합니다.' Use a connection string. Dim db As New Northwind _ ("C:\linqtest\northwnd.mdf") ' Query for customers from Seattle. Dim custs = _ From cust In db.Customers _ Where cust.City = "Seattle" _ Select cust For Each custObj In custs Console.WriteLine("ID=" & custObj.CustomerID) Next ' Freeze the console window. Console.ReadLine()
F5 키를 눌러 애플리케이션을 디버깅합니다.
콘솔 창 출력은 다음과 같습니다.
ID=WHITC
콘솔 창에서 Enter 키를 눌러 애플리케이션을 닫습니다.
이 애플리케이션을 저장하려면 파일 메뉴에서 모두 저장을 클릭합니다.
다음 단계
다음 연습(연습: 데이터 조작(Visual Basic))에서는 데이터를 조작하는 방법을 보여 줍니다. 다음 연습에서는 이미 완료한 이 시리즈의 연습 두 개를 저장할 필요가 없습니다.