비고
클래스 및 관련 클래스는 DataSet 2000년대 초반의 레거시 .NET Framework 기술로, 애플리케이션이 데이터베이스와 연결이 끊긴 동안 애플리케이션이 메모리의 데이터로 작업할 수 있도록 합니다. 이 기술은 사용자가 데이터를 수정하고 변경 내용을 데이터베이스에 다시 유지할 수 있도록 하는 앱에 특히 유용합니다. 데이터 세트는 입증된 성공적인 기술이지만 새 .NET 애플리케이션에 권장되는 방법은 Entity Framework Core를 사용하는 것입니다. Entity Framework는 테이블 형식 데이터를 개체 모델로 사용하는 보다 자연스러운 방법을 제공하며 더 간단한 프로그래밍 인터페이스를 제공합니다.
Visual Studio의 LINQ to SQL 도구는 데이터베이스의 개체를 기반으로 하는 LINQ to SQL 클래스(엔터티 클래스)를 만들고 편집하기 위한 시각적 디자인 화면을 제공합니다. LINQ to SQL을 사용하면 LINQ 기술을 사용하여 SQL 데이터베이스에 액세스할 수 있습니다. 자세한 내용은 LINQ(언어 통합 쿼리)를 참조하세요.
기본적으로 업데이트를 수행하는 논리는 LINQ to SQL 런타임에서 제공됩니다. 런타임은 테이블의 스키마(열 정의 및 기본 키 정보)를 기반으로 기본 Insert
, Update
, 및 Delete
문을 만듭니다. 기본 동작을 사용하지 않으려면 업데이트 동작을 구성하고 데이터베이스의 데이터 작업에 필요한 삽입, 업데이트 및 삭제를 수행하기 위한 특정 저장 프로시저를 지정할 수 있습니다. 기본 동작이 생성되지 않은 경우(예: 엔터티 클래스가 뷰에 매핑되는 경우) 이 작업을 수행할 수도 있습니다. 또한 데이터베이스에 저장 프로시저를 통해 테이블 액세스가 필요한 경우 기본 업데이트 동작을 재정의할 수 있습니다. 자세한 내용은 저장 프로시저를 사용하여 작업 사용자 지정을 참조하세요.
비고
이 연습을 수행하려면 Northwind 데이터베이스에 대한 InsertCustomer, UpdateCustomer, 및 DeleteCustomer 저장 프로시저를 사용할 수 있어야 합니다.
이 연습에서는 저장 프로시저를 사용하여 데이터베이스에 데이터를 다시 저장하기 위한 기본 LINQ to SQL 런타임 동작을 재정의하기 위해 수행해야 하는 단계를 제공합니다.
이 연습에서는 다음 작업을 수행하는 방법을 알아봅니다.
새 Windows Forms 애플리케이션을 만들고 LINQ to SQL 파일을 추가합니다.
Northwind 테이블에 매핑되는 엔터티 클래스를 만듭니다
Customers
.LINQ to SQL
Customer
클래스를 참조하는 개체 데이터 원본을 만듭니다.Windows Form을 생성하고, DataGridView을(를)
Customer
클래스에 바인딩합니다.양식에 대한 저장 기능을 구현합니다.
DataContext 메서드를 만들려면 O/R 디자이너에 저장 프로시저를 추가하십시오.
Customer
저장 프로시저를 사용하여 삽입, 업데이트 및 삭제를 수행하도록 클래스를 구성합니다.
필수 조건
이 연습에서는 SQL Server Express LocalDB 및 Northwind 샘플 데이터베이스를 사용합니다.
SQL Server Express LocalDB가 없는 경우 SQL Server Express 다운로드 페이지 또는 Visual Studio 설치 관리자를 통해 설치합니다. Visual Studio 인스톨러에서 SQL Server Express LocalDB를 데이터 저장 및 처리 워크로드의 일부로 또는 개별 구성 요소로 설치할 수 있습니다.
다음 단계에 따라 Northwind 샘플 데이터베이스를 설치합니다.
Visual Studio에서 SQL Server 개체 탐색기 창을 엽니다. (SQL Server 개체 탐색기는Visual Studio 설치 관리자에서 데이터 스토리지 및 처리 워크로드의 일부로 설치됩니다.) SQL Server 노드를 확장합니다. LocalDB 인스턴스를 마우스 오른쪽 단추로 클릭하고 새 쿼리 선택합니다.
쿼리 편집기 창이 열립니다.
Northwind Transact-SQL 스크립트를 클립보드에 복사합니다. 이 T-SQL 스크립트는 Northwind 데이터베이스를 처음부터 만들고 데이터로 채웁니다.
T-SQL 스크립트를 쿼리 편집기에 붙여넣은 다음 실행 단추를 선택합니다.
잠시 후 쿼리 실행이 완료되고 Northwind 데이터베이스가 만들어집니다.
애플리케이션 만들기 및 LINQ to SQL 클래스 추가
LINQ to SQL 클래스를 사용하고 Windows Form에 데이터를 표시하기 때문에 새 Windows Forms 애플리케이션을 만들고 LINQ to SQL 클래스 파일을 추가합니다.
비고
이 문서의 지침은 Visual Studio에서 사용할 수 있는 IDE(대화형 개발 환경)의 최신 버전을 보여 줍니다. 컴퓨터에 일부 사용자 인터페이스 요소에 대한 다른 이름 또는 위치가 표시될 수 있습니다. 다른 버전의 Visual Studio 또는 다른 환경 설정을 사용할 수 있습니다. 자세한 내용은 IDE 개인 설정참조하세요.
LINQ to SQL 클래스를 포함하는 새 Windows Forms 애플리케이션 프로젝트를 만들려면
Visual Studio의 파일 메뉴에서 새>프로젝트를 선택합니다.
왼쪽 창에서 Visual C# 또는 Visual Basic 을 확장한 다음 , Windows Desktop을 선택합니다.
가운데 창에서 Windows Forms 앱 프로젝트 유형을 선택합니다.
프로젝트 이름을 UpdatingWithSProcsWalkthrough로 지정한 다음 확인을 선택합니다.
UpdatingWithSProcsWalkthrough 프로젝트가 만들어지고 솔루션 탐색기에 추가됩니다.
프로젝트 메뉴에서 새 항목 추가클릭합니다.
LINQ to SQL 클래스 템플릿을 클릭하고 이름 상자에 Northwind.dbml을 입력합니다.
추가를 클릭합니다.
빈 LINQ to SQL 클래스 파일(Northwind.dbml)이 프로젝트에 추가되고 O/R 디자이너 가 열립니다.
Customer 엔터티 클래스와 개체 데이터 원본을 만들기
서버 탐색기 또는 데이터베이스 탐색기에서 O/R 디자이너로 테이블을 끌어 데이터베이스 테이블에 매핑되는 LINQ to SQL 클래스를 만듭니다. 그 결과 데이터베이스의 테이블에 매핑되는 LINQ to SQL 엔터티 클래스가 생성됩니다. 엔터티 클래스를 만든 후에는 공용 속성이 있는 다른 클래스와 마찬가지로 개체 데이터 원본으로 사용할 수 있습니다.
Customer 엔터티 클래스를 작성하고 데이터 원본을 구성하려면
서버 탐색기 또는 데이터베이스 탐색기에서 Northwind 샘플 데이터베이스의 SQL Server 버전에서 Customer 테이블을 찾습니다.
서버 탐색기 또는 데이터베이스 탐색기에서 *O/R 디자이너 화면으로 고객 노드를 끕니다.
Customer라는 엔터티 클래스가 만들어집니다. Customers 테이블의 열에 해당하는 속성이 있습니다. 엔터티 클래스는 Customers 테이블의 단일 고객을 나타내므로 Customer( 고객 아님)로 이름이 지정됩니다.
비고
이 이름 바꾸기 동작을 복수화라고 합니다. 옵션 대화 상자에서 설정하거나 해제할 수 있습니다. 자세한 내용은 방법: 복수화 켜기 및 끄기(O/R 디자이너)를 참조하세요.
빌드 메뉴에서 Build UpdatingwithSProcsWalkthrough를 클릭하여 프로젝트를 빌드합니다.
데이터 원본 창을 열려면 데이터 메뉴에서 데이터 원본 표시를 클릭합니다.
데이터 원본 창에서 새 데이터 원본 추가클릭합니다.
데이터 원본 유형 선택 페이지에서 개체를 클릭한 다음 다음을 선택합니다.
UpdatingwithSProcsWalkthrough 노드를 확장하고 Customer 클래스를 찾아 선택합니다.
비고
Customer 클래스를 사용할 수 없는 경우 마법사에서 취소하고 프로젝트를 빌드한 다음 마법사를 다시 실행합니다.
마침을 클릭하여 데이터 원본을 만들고 고객 엔터티 클래스를 데이터 원본 창에 추가합니다.
DataGridView를 만들어 Windows Form에 고객 데이터 표시
LINQ에서 SQL 데이터 원본 항목을 데이터 원본 창에서 Windows Form으로 끌어 엔터티 클래스에 바인딩된 컨트롤을 만듭니다.
엔터티 클래스에 바인딩된 컨트롤을 추가하려면
디자인 뷰에서 Form1을 엽니다.
데이터 원본 창에서 고객 노드를 Form1로 끕니다.
비고
데이터 원본 창을 표시하려면 데이터 메뉴에서데이터 원본 표시를 클릭합니다.
코드 편집기에서 Form1 을 엽니다.
폼에 전역적으로 추가하되, 특정 메서드 외부이면서 클래스 내
Form1
코드 다음에 추가합니다.이벤트에 대한
Form_Load
이벤트 처리기를 만들고 처리기에 다음 코드를 추가합니다.
저장 기능 구현
기본적으로 저장 단추는 사용하도록 설정되지 않으며 저장 기능은 구현되지 않습니다. 또한 개체 데이터 원본에 대해 데이터 바인딩된 컨트롤을 만들 때 변경된 데이터를 데이터베이스에 저장하기 위해 코드가 자동으로 추가되지 않습니다. 이 섹션에서는 저장 단추를 사용하도록 설정하고 LINQ to SQL 개체에 대한 저장 기능을 구현하는 방법을 설명합니다.
저장 기능을 구현하려면
디자인 뷰에서 Form1을 엽니다.
CustomerBindingNavigator에서 저장 단추(플로피 디스크 아이콘이 있는 단추)를 선택합니다.
속성 창에서 Enabled 속성을 True로 설정합니다.
저장 단추를 두 번 클릭하여 이벤트 처리기를 만들고 코드 편집기로 전환합니다.
저장 단추 이벤트 처리기에 다음 코드를 추가합니다.
업데이트를 수행하기 위한 기본 동작 재정의(삽입, 업데이트 및 삭제)
기본 업데이트 동작을 재정의하려면
O/R 디자이너에서 LINQ to SQL 파일을 엽니다. (솔루션 탐색기에서 Northwind.dbml 파일을 두 번 클릭합니다.)
서버 탐색기 또는 데이터베이스 탐색기에서 Northwind 데이터베이스 저장 프로시저 노드를 확장하고 InsertCustomers, UpdateCustomers 및 DeleteCustomers 저장 프로시저를 찾습니다.
세 저장 프로시저를 모두 O/R 디자이너로 끕니다.
저장 프로시저는 DataContext 메서드로 메서드 창에 추가됩니다. 자세한 내용은 DataContext 메서드(O/R 디자이너)참조하세요.
O/R 디자이너에서 Customer 엔터티 클래스를 선택합니다.
속성 창에서 삽입 속성을 선택합니다.
런타임 사용 옆의 줄임표(...)를 클릭하여 동작 구성 대화 상자를 엽니다.
사용자 지정을 선택합니다.
사용자 지정 목록에서 InsertCustomers 메서드를 선택합니다.
적용을 클릭하여 선택한 클래스 및 동작에 대한 구성을 저장합니다.
비고
각 변경을 수행한 후 적용 을 클릭하는 한 각 클래스/동작 조합에 대한 동작을 계속 구성할 수 있습니다. 적용을 클릭하기 전에 클래스 또는 동작을 변경하면 변경 내용을 적용할 수 있는 기회를 제공하는 경고 대화 상자가 나타납니다.
동작 목록에서 업데이트를 선택합니다.
사용자 지정을 선택합니다.
사용자 지정 목록에서 UpdateCustomers 메서드를 선택합니다.
메서드 인수 및 클래스 속성 목록을 검사하고 테이블의 일부 열에 대해 두 개의 메서드 인수와 두 개의 클래스 속성이 있는지 확인합니다. 이렇게 하면 변경 내용을 더 쉽게 추적하고 동시성 위반을 확인하는 문을 만들 수 있습니다.
Original_CustomerID 메서드 인수를 CustomerID(원래) 클래스 속성에 매핑합니다.
비고
기본적으로 메서드 인수는 이름이 일치할 때 클래스 속성에 매핑됩니다. 속성 이름이 변경되고 테이블과 엔터티 클래스 간에 더 이상 일치하지 않는 경우 O/R 디자이너 가 올바른 매핑을 확인할 수 없는 경우 매핑할 동등한 클래스 속성을 선택해야 할 수 있습니다. 또한 메서드 인수에 매핑할 유효한 클래스 속성이 없는 경우 클래스 속성 값을 (None)으로 설정할 수 있습니다.
적용을 클릭하여 선택한 클래스 및 동작에 대한 구성을 저장합니다.
동작 목록에서 삭제를 선택합니다.
사용자 지정을 선택합니다.
사용자 지정 목록에서 DeleteCustomers 메서드를 선택합니다.
Original_CustomerID 메서드 인수를 CustomerID(원래) 클래스 속성에 매핑합니다.
OK를 클릭합니다.
비고
이 특정 연습에서는 문제가 되지 않지만 LINQ to SQL은 삽입 및 업데이트 중에 ID(자동 증가), rowguidcol(데이터베이스에서 생성된 GUID(Globally Unique Identifier) 및 타임스탬프 열에 대해 데이터베이스 생성 값을 자동으로 처리합니다. 다른 열 형식의 데이터베이스 생성 값은 예기치 않게 null 값이 발생합니다. 데이터베이스 생성 값을 반환하려면, IsDbGenerated을(를) true
로 설정하고, AutoSync을(를) AutoSync.Always, AutoSync.OnInsert 또는 AutoSync.OnUpdate 중 하나로 수동으로 설정해야 합니다.
애플리케이션 테스트
애플리케이션을 다시 실행하여 UpdateCustomers 저장 프로시저가 데이터베이스의 고객 레코드를 올바르게 업데이트했는지 확인합니다.
F5키를 누릅니다.
그리드에서 레코드를 수정하여 업데이트 동작을 테스트합니다.
새 레코드를 추가하여 삽입 동작을 테스트합니다.
저장 단추를 클릭하여 변경 내용을 데이터베이스에 다시 저장합니다.
양식을 닫습니다.
F5 키를 누르고 업데이트된 레코드와 새로 삽입된 레코드가 유지되는지 확인합니다.
3단계에서 만든 새 레코드를 삭제하여 삭제 동작을 테스트합니다.
저장 단추를 클릭하여 변경 내용을 제출하고 데이터베이스에서 삭제된 레코드를 제거합니다.
양식을 닫습니다.
F5 키를 누르고 삭제된 레코드가 데이터베이스에서 제거되었는지 확인합니다.
비고
애플리케이션에서 SQL Server Express Edition을 사용하는 경우 데이터베이스 파일의 출력 디렉터리로 복사 속성 값에 따라 10단계에서 F5 키를 누르면 변경 내용이 나타나지 않을 수 있습니다.
다음 단계
애플리케이션 요구 사항에 따라 LINQ to SQL 엔터티 클래스를 만든 후 수행할 수 있는 몇 가지 단계가 있습니다. 이 애플리케이션에 대해 수행할 수 있는 몇 가지 향상된 기능은 다음과 같습니다.
업데이트 중에 동시성 검사를 구현합니다. 자세한 내용은 낙관적 동시성: 개요를 참조하세요.
LINQ 쿼리를 추가하여 데이터를 필터링합니다. 자세한 내용은 LINQ 쿼리 소개(C#)를 참조하세요.