연습: LINQ to SQL 클래스 만들기(O/R 디자이너)
O/R 디자이너(개체 관계형 디자이너)에서는 데이터베이스의 개체를 기반으로 LINQ to SQL 클래스(엔터티 클래스)를 만들고 편집하는 시각적 디자인 화면을 제공합니다. LINQ to SQL [LINQ to SQL]을 사용하면 LINQ 기술로 SQL 데이터베이스에 액세스할 수 있습니다.자세한 내용은 LINQ(통합 언어 쿼리)를 참조하십시오.
이 연습에서는 Northwind 데이터베이스의 Customers 및 Orders 테이블에 매핑된 LINQ to SQL 엔터티 클래스를 만들고 Windows Form에 데이터를 표시하기 위해 따라야 하는 단계를 제공합니다.테이블의 데이터를 표시하기 위한 단계 외에 데이터를 LINQ 쿼리에 바인딩하기 위한 단계도 제공됩니다.마지막으로 엔터티 클래스에서 데이터베이스로 업데이트를 보내기 위해 저장 프로시저를 사용하여 기본 LINQ to SQL 논리를 바꾸는 단계가 제공됩니다.
이 연습을 통해 다음 작업을 수행하는 방법을 배웁니다.
LINQ to SQL 파일을 프로젝트에 추가합니다.
데이터베이스의 관련 테이블에 매핑되는 새 엔터티 클래스를 만듭니다.
엔터티 클래스를 참조하는 개체 데이터 소스를 만듭니다.
엔터티 클래스에 바인딩된 컨트롤을 포함하는 Windows Form을 만듭니다.
엔터티 클래스와 데이터베이스 간에 데이터를 로드하고 저장하기 위한 코드를 추가합니다.
간단한 LINQ 쿼리를 생성하고 결과를 폼에 표시합니다.
저장 프로시저를 O/R 디자이너에 추가합니다.
저장 프로시저를 사용하여 삽입, 업데이트 및 삭제를 수행하도록 엔터티 클래스를 구성합니다.
필수 구성 요소
이 연습을 완료하려면 다음이 필요합니다.
Northwind 샘플 데이터베이스의 SQL Server 버전에 액세스할 수 있어야 합니다. 자세한 내용은 방법: 샘플 데이터베이스 설치를 참조하십시오.
Northwind 데이터베이스에 대한 UpdateCustomer 저장 프로시저.자세한 내용은 연습: Northwind Customers 테이블의 업데이트 저장 프로시저 만들기를 참조하십시오.
Windows 기반 응용 프로그램 만들기
나중에 LINQ to SQL 클래스를 사용하여 작업하고 데이터를 Windows Form에 표시할 것이므로 이 연습의 첫 번째 단계는 새 Windows Forms 응용 프로그램을 만드는 것입니다.
새 Windows 응용 프로그램 프로젝트를 만들려면
파일 메뉴에서 새 프로젝트를 만듭니다.
프로젝트 이름을 ORDesignerWalkthrough로 지정합니다.
[!참고]
Visual Basic 및 C# 프로젝트에서 O/R 디자이너를 지원하므로 이 언어 중 하나로 새 프로젝트를 만듭니다.
Windows Forms 응용 프로그램 템플릿을 클릭한 다음 확인을 클릭합니다.자세한 내용은 클라이언트 응용 프로그램 개발를 참조하십시오.
ORDesignerWalkthrough 프로젝트가 만들어져 솔루션 탐색기에 추가됩니다.
프로젝트에 LINQ to SQL 클래스 파일 추가(O/R 디자이너 열기)
엔터티 클래스가 만들어져 LINQ to SQL 클래스 파일(.dbml 파일)에 저장됩니다..dbml 파일을 열면 O/R 디자이너가 열립니다. 새 항목 추가 대화 상자에서 LINQ to SQL 클래스 템플릿을 선택하여 프로젝트에 .dbml 파일을 추가합니다.
프로젝트에 .dbml 파일을 추가하려면
프로젝트 메뉴에서 새 항목 추가를 클릭합니다.
LINQ to SQL 클래스 템플릿을 클릭하고 이름 상자에 Northwind.dbml을 입력합니다.
추가를 클릭합니다.
빈 LINQ to SQL 클래스 파일(Northwind.dbml)이 프로젝트에 추가되고 O/R 디자이너가 열립니다.
새 LINQ to SQL 파일을 프로젝트에 추가한 후에는 빈 디자인 화면이 열리고 별도의 창이 두 개 표시됩니다.왼쪽 창은 엔터티 클래스가 표시되고 구성되는 엔터티 창입니다.오른쪽 창은 디자이너에 추가된 DataContext 메서드를 표시하는 메서드 창입니다.메서드 창이 보이지 않으면 엔터티 창에서 빈 영역을 마우스 오른쪽 단추로 클릭하고 메서드 창 표시를 클릭합니다.완전히 빈 화면은 구성될 준비가 된 DataContext를 나타냅니다.DataContext 이름은 .dbml 파일에 대해 제공한 이름과 일치합니다.이 연습에서는 LINQ to SQL 파일의 이름을 Northwind.dbml로 지정했기 때문에 DataContext의 이름이 NorthwindDataContext로 지정됩니다.디자이너에서 빈 영역을 클릭하고 속성 창을 조사하여 확인할 수 있습니다.
[!참고]
DataContext 클래스에는 데이터베이스에 연결하고 데이터베이스에서 데이터를 조작(예: 삽입, 업데이트 및 삭제 수행)하기 위한 메서드 및 속성이 포함되어 있습니다.자세한 내용은 DataContext 메서드(O/R 디자이너)를 참조하십시오.
Customer 및 Order 엔터티 클래스 만들기
서버 탐색기/데이터베이스 탐색기에서 O/R 디자이너로 테이블을 끌어 데이터베이스 테이블에 매핑된 LINQ to SQL 클래스를 만듭니다.그러면 데이터베이스의 테이블에 매핑되는 LINQ to SQL 엔터티 클래스가 생성됩니다.
Customer 엔터티 클래스를 O/R 디자이너에 추가하려면
서버 탐색기/데이터베이스 탐색기에서 Northwind 샘플 데이터베이스의 SQL Server 버전에서 테이블을 찾습니다.자세한 내용은 방법: Northwind 데이터베이스에 데이터 연결 만들기를 참조하십시오.
서버 탐색기/데이터베이스 탐색기에서 Customers 노드를 O/R 디자이너 화면으로 끌어 옵니다.
Customer라는 엔터티 클래스가 만들어집니다.이 클래스에는 Customers 테이블의 열에 해당하는 속성이 있습니다.이 엔터티 클래스는 Customers 테이블의 단일 고객을 나타내므로 이름이 Customers가 아닌 Customer로 지정됩니다.
[!참고]
이러한 이름 바꾸기 동작을 복수 적용이라고 합니다.옵션 대화 상자(Visual Studio)에서 이 동작을 설정하거나 해제할 수 있습니다.자세한 내용은 방법: 복수 적용 설정 및 해제(O/R 디자이너)를 참조하십시오.
서버 탐색기/데이터베이스 탐색기에서 Orders 노드를 O/R 디자이너 화면으로 끌어 옵니다.
Order라는 엔터티 클래스가 Customer 엔터티 클래스에 대한 Customer_Order 연결 관계와 함께 만들어집니다.이 클래스에는 Orders 테이블의 열에 해당하는 속성이 있습니다.
[!참고]
이 엔터티 클래스는 단일 주문을 나타내므로 이름이 Order로 지정됩니다.부모 클래스(Customer)에는 해당 특정 고객에 대한 주문 컬렉션을 나타내는 Orders 속성이 있습니다.LINQ to SQL 연결에 대한 자세한 내용은 방법: LINQ to SQL 클래스 간에 연결 관계 만들기(O/R 디자이너)를 참조하십시오.
Customer 엔터티 클래스로 개체 데이터 소스 만들기
엔터티 클래스는 공용 속성이 있는 다른 클래스와 마찬가지로 개체 데이터 소스로 사용될 수 있습니다.데이터 소스 창에 추가되고 폼으로 끌어 와서 데이터 바인딩된 컨트롤(개체의 공용 속성에 있는 값에 바인딩된 컨트롤)을 만들 수 있습니다.데이터 소스 구성 마법사를 실행하고 마법사에서 데이터 소스에 대한 개체를 클릭하여 엔터티 클래스를 데이터 소스 창에 추가합니다.
데이터 소스 창에서 Customer를 개체 데이터 소스로 추가하려면
빌드 메뉴에서 ORDesignerWalkthrough 빌드를 클릭하여 프로젝트를 빌드합니다.
데이터 메뉴에서 데이터 소스 표시를 클릭합니다.
데이터 소스 창에서 새 데이터 소스 추가를 클릭합니다.
데이터 소스 형식 선택 페이지에서 개체를 클릭하고 다음을 클릭합니다.
프로젝트의 이름이 지정된 노드인 ORDesignerWalkthrough 노드를 확장하고 Customer 클래스를 찾아서 선택합니다.
[!참고]
Customer 클래스를 사용할 수 없는 경우에는 마법사를 취소하고 프로젝트를 빌드한 다음 마법사를 다시 실행합니다.
마침을 클릭하여 데이터 소스를 만들고 데이터 소스 창에 Customer 엔터티 클래스를 추가합니다.
데이터 바인딩된 컨트롤을 만들어 Windows Form에 데이터 표시
데이터 소스 창에서 Windows Form으로 LINQ to SQL 데이터 소스 항목을 끌어 와서 엔터티 클래스에 바인딩된 컨트롤을 만듭니다.
엔터티 클래스에 바인딩된 컨트롤을 추가하려면
디자인 뷰에서 Form1을 엽니다.
데이터 소스 창에서 Customer 노드를 Form1로 끌어서 놓습니다.
[!참고]
데이터 소스 창을 표시하려면 데이터 메뉴에서 데이터 소스 표시를 클릭합니다.
Orders 노드를 데이터 소스 창에서 Form1로 끌어서 놓습니다.CustomerDataGridView 아래에 넣습니다.
코드 뷰에서 Form1을 엽니다.
폼에서 특정 메서드의 외부이지만 Form1 클래스의 내부인 위치에 다음 코드를 폼에 대해 전역적으로 추가합니다.
Private NorthwindDataContext1 As New NorthwindDataContext
private NorthwindDataContext northwindDataContext1 = new NorthwindDataContext();
Form_Load 이벤트에 대한 이벤트 처리기를 만들고 다음 코드를 처리기에 추가합니다.
CustomerBindingSource.DataSource = NorthwindDataContext1.Customers
customerBindingSource.DataSource = northwindDataContext1.Customers;
응용 프로그램 테스트
응용 프로그램을 실행합니다.이 시점에서 폼에는 Customers 테이블의 데이터를 표시하는 DataGridView와 선택된 고객의 주문 데이터를 표시하는 두 번째 DataGridView가 포함되어 있습니다.
[!참고]
저장 단추를 사용할 수 없습니다.저장 기능은 다음 단원에서 구현합니다.
응용 프로그램을 테스트하려면
F5 키를 누릅니다.
모눈 안에 데이터가 나타나는지 확인합니다.
고객을 선택합니다.
표시된 주문이 선택된 고객에 대한 것인지 확인합니다.
폼을 닫습니다.디버그 메뉴에서 디버깅 중지를 클릭합니다.
저장 기능 구현
앞에서 언급했듯이 기본적으로 저장 단추를 사용할 수 없으며 저장 기능이 구현되어 있지 않습니다.또한 개체 데이터 소스에 대해 데이터 바인딩된 컨트롤을 만들 때 변경된 데이터를 폼에 저장하기 위한 코드가 자동으로 추가되지 않습니다.이 단원에서는 LINQ to SQL 개체에서 저장 단추를 사용하고 저장 기능을 구현하는 방법에 대해 설명합니다.
저장 기능을 구현하려면
디자인 뷰에서 Form1을 엽니다.
CustomerBindingNavigator에서 저장 단추를 선택합니다.저장 단추는 플로피 디스크 아이콘 레이블이 지정된 단추입니다.
속성 창에서 Enabled 속성을 True로 설정합니다.
저장 단추를 두 번 클릭하여 이벤트 처리기를 만들고 코드 편집기로 전환합니다.
저장 단추 이벤트 처리기에 다음 코드를 추가합니다.
Try NorthwindDataContext1.SubmitChanges() Catch ex As Exception MessageBox.Show(ex.Message) End Try
try { northwindDataContext1.SubmitChanges(); } catch (Exception ex) { MessageBox.Show(ex.Message); }
응용 프로그램 테스트
응용 프로그램을 실행합니다.저장 단추가 활성화되고 데이터를 저장할 수 있게 됩니다.
응용 프로그램을 테스트하려면
F5 키를 누릅니다.
모눈에서 일부 데이터를 수정합니다.모눈의 편집된 행에서 빠져 나와서 진행 중인 변경 내용을 커밋합니다.
저장 단추를 클릭하여 변경 내용을 데이터베이스에 다시 저장합니다.
폼을 닫습니다.
F5 키를 누르고 변경 내용이 유지되었는지 확인합니다. 또는 데이터베이스에서 테이블을 찾아서 변경 내용이 저장되었는지 확인합니다.
LINQ 쿼리에 바인딩
CustomerBindingSource를 DataContext에 바인딩하는 것 외에 LINQ 쿼리에 직접 바인딩할 수도 있습니다.LINQ 쿼리를 만드는 방법에 대한 자세한 내용은 LINQ 쿼리 소개(C#)를 참조하십시오.
폼에 Button 및 TextBox 추가
컨트롤을 LINQ 쿼리에 바인딩하는 방법을 배우려면 쿼리 매개 변수를 입력할 수 있는 폼에 컨트롤을 추가한 다음 쿼리를 실행합니다.
컨트롤을 폼에 추가하려면
디자인 뷰에서 Form1을 엽니다.
폼에 TextBox를 추가하고 Name 속성을 CityTextBox로 설정합니다.
폼에 Button을 추가하고 다음 속성을 설정합니다.
Name = RunQueryButton
Text = 쿼리 실행
LINQ 쿼리에 데이터 바인딩
코드를 추가하여 LINQ 쿼리를 실행합니다.쿼리는 CityTextBox에 입력된 값을 쿼리 매개 변수로 사용합니다.
LINQ 쿼리에 바인딩하려면
RunQueryButton을 두 번 클릭하고 다음 코드를 RunQueryButton_click 이벤트 처리기에 추가합니다.
Dim CustomersQuery = From customers in NorthwindDataContext1.Customers _ Where customers.City = CityTextBox.Text _ Select customers CustomerBindingSource.DataSource = CustomersQuery
var CustomersQuery = from customers in northwindDataContext1.Customers where customers.City == CityTextBox.Text select customers; customerBindingSource.DataSource = CustomersQuery;
응용 프로그램 테스트
응용 프로그램을 실행합니다.이제 특정 도시에 있는 고객에 대해 쿼리할 수 있습니다.
응용 프로그램을 테스트하려면
F5 키를 누릅니다.
텍스트 상자에 London을 입력합니다.
쿼리 실행 단추를 클릭합니다.
City 속성에 London이라는 값이 있는 고객만 표시되는지 확인합니다.
업데이트(삽입, 업데이트 및 삭제)를 수행하기 위한 기본 동작 재정의
기본적으로 업데이트를 수행하는 논리는 LINQ to SQL 런타임에서 제공합니다. 런타임에서는 엔터티 클래스에 데이터를 채우는 데 사용되는 Select 문을 기반으로 기본 Insert, Update 및 Delete 문을 만듭니다.기본 동작을 사용하지 않으려면 업데이트 동작을 구성하고 데이터베이스의 데이터를 조작하는 데 필요한 삽입, 업데이트 및 삭제를 수행하기 위한 특정 저장 프로시저를 지정할 수 있습니다.엔터티 클래스가 조인된 테이블에 매핑되는 때와 같이 기본 동작이 생성되지 않은 경우에도 이렇게 할 수 있습니다.또한 저장 프로시저를 통해 데이터베이스의 테이블에 액세스해야 하는 경우에 기본 업데이트 동작을 재정의할 수 있습니다.
[!참고]
이 단원에서는 Northwind 데이터베이스의 InsertCustomer, UpdateCustomer 및 DeleteCustomer 저장 프로시저를 추가로 사용할 수 있어야 합니다.이러한 저장 프로시저를 만드는 방법에 대한 자세한 내용은 연습: Northwind Customers 테이블의 업데이트 저장 프로시저 만들기를 참조하십시오.
기본 업데이트 동작을 재정의하려면
O/R 디자이너의 솔루션 탐색기에서 Northwind.dbml 파일을 두 번 클릭하여 LINQ to SQL 파일을 엽니다.
서버 탐색기/데이터베이스 탐색기에서 Northwind 데이터베이스 저장 프로시저 노드를 확장하고 UpdateCustomers 저장 프로시저를 찾습니다.
UpdateCustomers 저장 프로시저를 O/R 디자이너로 끌어서 놓습니다.
UpdateCustomers 저장 프로시저가 메서드 창에 DataContext 메서드로 추가됩니다.자세한 내용은 DataContext 메서드(O/R 디자이너)를 참조하십시오.
O/R 디자이너에서 Customer 엔터티 클래스를 선택합니다.
속성 창에서 재정의할명령(Insert, Update 또는 Delete)을 선택합니다.이 예제의 경우에는 Update 속성을 선택합니다.
런타임 사용 옆의 줄임표를 클릭하여 동작 구성 대화 상자를 엽니다.
사용자 지정을 선택합니다
사용자 지정 목록에서 UpdateCustomers 메서드를 선택합니다.
메서드 인수 및 클래스 속성 목록을 살펴보면 테이블의 일부 열에 두 개의 메서드 인수와 두 개의 클래스 속성이 있습니다.이는 변경 내용을 추적하고 동시성 위반을 검사하는 문을 만드는 데 도움이 됩니다.
원래 메서드 인수(Original_ArgumentName)를 원래 속성(PropertyName (Original))에 매핑합니다.이 연습에서는 Original_CustomerID 인수를 CustomerID (Original) 속성에 매핑해야 합니다.
[!참고]
기본적으로 메서드 인수는 이름이 일치하는 경우 클래스 속성에 매핑됩니다.속성 이름이 변경되어서 더 이상 테이블과 엔터티 클래스 간에 일치하지 않으면 디자이너에서 올바른 매핑을 결정할 수 없는 경우 매핑할 해당 클래스 속성을 선택해야 합니다.또한 메서드 인수를 매핑할 올바른 클래스 속성이 없는 경우 클래스 속성 값을 (없음)으로 설정할 수 있습니다.
확인을 클릭합니다.
응용 프로그램 테스트
응용 프로그램을 다시 실행하여 UpdateCustomers 저장 프로시저가 데이터베이스의 고객 레코드를 제대로 업데이트하는지 확인합니다.
응용 프로그램을 테스트하려면
F5 키를 누릅니다.
ALFKI의 모눈에서 ContactName 열을 찾습니다.
이름을 Maria Anders에서 Anders로 변경합니다.
해당 행을 빠져 나와 변경 내용을 커밋합니다.
저장 단추를 클릭합니다.
폼을 닫습니다.
F5 키를 눌러 응용 프로그램을 다시 실행하고 ALFKI의 ContactName 열에 Anders만 나타나는지 확인합니다.
다음 단계
응용 프로그램 요구 사항에 따라 LINQ to SQL 엔터티 클래스를 만든 후 몇 단계를 더 수행할 수도 있습니다.이 응용 프로그램에서 보완할 수 있는 사항은 다음과 같습니다.
Insert 및 Delete 명령에 사용할 저장 프로시저를 더 추가합니다.자세한 내용은 방법: 저장 프로시저를 할당하여 업데이트, 삽입 및 삭제 수행(O/R 디자이너)을 참조하십시오.
다양한 LINQ 쿼리를 생성하여 필터링된 데이터를 반환합니다.자세한 내용은 방법: 정보 쿼리를 참조하십시오.
참고 항목
개념
Visual Studio 2012 RC 데이터 응용 프로그램 개발의 새로운 기능
관련 자료
LINQ General Programming Guide
LINQ Documentation Roadmap