LINQ to SQL은 웹 서비스와 같이 느슨하게 결합된 DAL(데이터 액세스 계층)의 중간 계층에서 사용하도록 특별히 설계되었습니다. 프레젠테이션 계층이 ASP.NET 웹 페이지인 경우 웹 서버 컨트롤을 사용하여 LinqDataSource 중간 계층의 사용자 인터페이스와 LINQ to SQL 간의 데이터 전송을 관리합니다. 프레젠테이션 계층이 ASP.NET 페이지가 아닌 경우 중간 계층과 프레젠테이션 계층 모두 데이터의 직렬화 및 역직렬화를 관리하기 위해 몇 가지 추가 작업을 수행해야 합니다.
중간 계층에서 LINQ to SQL 설정
웹 서비스 또는 n 계층 애플리케이션에서 중간 계층에는 데이터 컨텍스트 및 엔터티 클래스가 포함됩니다. 설명서의 다른 위치에 설명된 대로 이러한 클래스를 수동으로 만들거나 SQLMetal.exe 또는 개체 관계형 디자이너를 사용하여 만들 수 있습니다. 디자인 타임에는 엔터티 클래스를 직렬화할 수 있도록 하는 옵션이 있습니다. 자세한 내용은 방법: 엔터티 직렬화 가능 만들기를 참조하세요. 또 다른 옵션은 serialize할 데이터를 캡슐화하는 별도의 클래스 집합을 만든 다음 LINQ 쿼리에서 데이터를 반환할 때 직렬화 가능한 형식으로 프로젝션하는 것입니다.
그런 다음 클라이언트가 데이터를 검색, 삽입 및 업데이트하기 위해 호출하는 메서드를 사용하여 인터페이스를 정의합니다. 인터페이스 메서드는 LINQ 쿼리를 래핑합니다. 모든 종류의 serialization 메커니즘을 사용하여 원격 메서드 호출 및 데이터 serialization을 처리할 수 있습니다. 유일한 요구 사항은 표준 Northwind 개체 모델의 Customers와 Orders 간에와 같이 개체 모델에 순환 또는 양방향 관계가 있는 경우 이를 지원하는 serializer를 사용해야 한다는 것입니다. WCF(Windows Communication Foundation) DataContractSerializer 는 양방향 관계를 지원하지만 비 WCF 웹 서비스와 함께 사용되는 XmlSerializer는 지원하지 않습니다. XmlSerializer를 사용하도록 선택하는 경우 개체 모델에 순환 관계가 없는지 확인해야 합니다.
Windows Communication Foundation에 대한 자세한 내용은 Visual Studio의 Windows Communication Foundation Services 및 WCF Data Services를 참조하세요.
LINQ to SQL 런타임 이벤트에 연결하고 비즈니스 규칙 또는 기타 도메인별 논리를 구현하기 위해 DataContext와 엔터티 클래스의 부분 클래스 및 메서드를 사용합니다. 자세한 내용은 N 계층 비즈니스 논리 구현을 참조하세요.
직렬화 가능 형식 정의
클라이언트 또는 프레젠테이션 계층에는 중간 계층에서 수신할 클래스에 대한 형식 정의가 있어야 합니다. 이러한 형식들은 엔터티 클래스 자체이거나 원격을 위해 엔터티 클래스의 특정 필드만 래핑하는 특수 클래스일 수 있습니다. 어떤 경우든 LINQ to SQL은 프레젠테이션 계층이 이러한 형식 정의를 획득하는 방법에 대해 전혀 신경 쓰지 않습니다. 예를 들어 프레젠테이션 계층은 WCF를 사용하여 형식을 자동으로 생성하거나 해당 형식이 정의된 DLL 복사본을 포함하거나 자체 버전의 형식만 정의할 수 있습니다.
데이터 검색 및 삽입
중간 계층은 프레젠테이션 계층이 데이터에 액세스하는 방법을 지정하는 인터페이스를 정의합니다. 예 GetProductByID(int productID): 또는 GetCustomers(). 중간 계층에서 메서드 본문은 일반적으로 새 인스턴스를 DataContext만들고 하나 이상의 테이블에 대해 쿼리를 실행합니다. 그런 다음 중간 계층은 결과를 IEnumerable<T>T 엔터티 클래스 또는 serialization에 사용되는 다른 형식으로 반환합니다. 프레젠테이션 계층은 쿼리 변수를 중간 계층으로 직접 보내거나 받지 않습니다. 두 계층은 구체적인 데이터의 값, 개체 및 컬렉션을 교환합니다. 컬렉션을 받은 후 프레젠테이션 계층은 LINQ to Objects를 사용하여 필요한 경우 쿼리할 수 있습니다.
데이터를 삽입할 때 프레젠테이션 계층은 새 개체를 생성하여 중간 계층으로 보내거나 중간 계층에서 제공하는 값에 따라 개체를 생성하도록 할 수 있습니다. 일반적으로 n 계층 애플리케이션에서 데이터를 검색하고 삽입하는 것은 2계층 애플리케이션의 프로세스와 크게 다르지 않습니다. 자세한 내용은 데이터베이스 쿼리 및 데이터 변경 내용 만들기 및 제출을 참조하세요.
업데이트 및 삭제에 대한 변경 내용 추적
LINQ to SQL은 타임스탬프(RowVersions라고도 합니다)와 원래 값에 따라 낙관적 동시성을 지원합니다. 데이터베이스 테이블에 타임스탬프가 있는 경우 업데이트 및 삭제에는 중간 계층 또는 프레젠테이션 계층에서 추가 작업이 거의 필요하지 않습니다. 그러나 낙관적 동시성 검사에 원래 값을 사용해야 하는 경우 프레젠테이션 계층은 해당 값을 추적하고 업데이트할 때 다시 전송해야 합니다. 프레젠테이션 계층의 엔터티에 대한 변경 내용은 중간 계층에서 추적되지 않기 때문입니다. 실제로 엔터티의 원래 조회와 최종 업데이트는 일반적으로 DataContext의 두 개의 완전히 별개의 인스턴스에 의해 수행됩니다.
프레젠테이션 계층의 변경 내용 수가 클수록 변경 내용을 추적하고 중간 계층으로 다시 패키지하는 것이 더 복잡해집니다. 변경 내용을 전달하기 위한 메커니즘의 구현은 애플리케이션에 전적으로 달려 있습니다. 유일한 요구 사항은 LINQ to SQL에 낙관적 동시성 검사에 필요한 원래 값을 제공해야 한다는 것입니다.
자세한 내용은 N 계층 애플리케이션의 데이터 검색 및 CUD 작업(LINQ to SQL)을 참조하세요.