次の方法で共有


LINQ to SQL N層アーキテクチャとWebサービス

LINQ to SQL は、Web サービスなどの疎結合データ アクセス層 (DAL) の中間層で使用するために特に設計されています。 プレゼンテーション層が ASP.NET Web ページの場合は、 LinqDataSource Web サーバー コントロールを使用して、中間層のユーザー インターフェイスと LINQ to SQL の間のデータ転送を管理します。 プレゼンテーション層が ASP.NET ページでない場合は、中間層とプレゼンテーション層の両方で、データのシリアル化と逆シリアル化を管理するために追加の作業を行う必要があります。

中間層での LINQ to SQL の設定

Web サービスまたは n 層アプリケーションでは、中間層にはデータ コンテキストとエンティティ クラスが含まれます。 これらのクラスは、手動で作成することも、ドキュメントの他の場所で説明されているように、SQLMetal.exe またはオブジェクト リレーショナル デザイナーを使用して作成することもできます。 デザイン時には、エンティティ クラスをシリアル化可能にするオプションがあります。 詳細については、「 方法: エンティティをシリアル化可能にする」を参照してください。 もう 1 つのオプションは、シリアル化するデータをカプセル化するクラスの別のセットを作成し、LINQ クエリでデータを返すときにそれらのシリアル化可能な型に投影することです。

次に、クライアントがデータの取得、挿入、更新を行うために呼び出すメソッドを使用してインターフェイスを定義します。 インターフェイス メソッドは LINQ クエリをラップします。 任意の種類のシリアル化メカニズムを使用して、リモート メソッド呼び出しとデータのシリアル化を処理できます。 唯一の要件は、標準の Northwind オブジェクト モデルの Customers と Orders の間など、オブジェクト モデルに循環または双方向のリレーションシップがある場合は、それをサポートするシリアライザーを使用する必要があることです。 Windows Communication Foundation (WCF) DataContractSerializer は双方向リレーションシップをサポートしていますが、WCF 以外の Web サービスで使用される XmlSerializer はサポートしていません。 XmlSerializer を使用する場合は、オブジェクト モデルに循環リレーションシップがないことを確認する必要があります。

Windows Communication Foundation の詳細については、 Visual Studio の Windows Communication Foundation Services と WCF Data Services に関するページを参照してください。

DataContextおよびエンティティ クラスの部分クラスとメソッドを使用して、LINQ to SQL ランタイム イベントにフックすることで、ビジネス ルールまたはその他のドメイン固有のロジックを実装します。 詳細については、「 N 層ビジネス ロジックの実装」を参照してください。

シリアル化可能な型の定義

クライアント層またはプレゼンテーション層には、中間層から受け取るクラスの型定義が必要です。 これらの型は、それ自体、エンティティ クラスにすることも可能です。または、リモート処理用にエンティティ クラスのいくつかのフィールドだけをラップする特殊クラスにすることも可能です。 いずれの場合も、LINQ to SQL は、プレゼンテーション層がこれらの型定義を取得する方法についてまったく気にしません。 たとえば、プレゼンテーション層では、WCF を使用して型を自動的に生成したり、それらの型が定義されている DLL のコピーを作成したり、独自のバージョンの型を定義したりできます。

データの取得と挿入

中間層は、プレゼンテーション層がデータにアクセスする方法を指定するインターフェイスを定義します。 たとえば、 GetProductByID(int productID)GetCustomers()などです。 中間層では、メソッド本体は通常、 DataContextの新しいインスタンスを作成し、そのテーブルの 1 つ以上に対してクエリを実行します。 その後、中間層は結果を IEnumerable<T>として返します。ここで、 T はエンティティ クラスまたはシリアル化に使用される別の型です。 プレゼンテーション層は、中間層に対して直接、または中間層からクエリ変数を送受信することはありません。 2 つの層は、値、オブジェクト、および具象データのコレクションを交換します。 コレクションを受け取った後、プレゼンテーション層は LINQ to Objects を使用して、必要に応じてクエリを実行できます。

データを挿入する場合、プレゼンテーション層は新しいオブジェクトを構築して中間層に送信するか、中間層が提供する値に基づいてオブジェクトを構築できます。 一般に、n 層アプリケーションでのデータの取得と挿入は、2 層アプリケーションのプロセスと大きな違いはありません。 詳細については、「 データベースの照会 」および「 データ変更の作成と送信」を参照してください。

更新と削除における変更内容の追跡

LINQ to SQL では、タイムスタンプ (RowVersions とも呼ばれます) と元の値に基づくオプティミスティック コンカレンシーがサポートされます。 データベース テーブルにタイムスタンプがある場合、更新と削除には中間層またはプレゼンテーション層で追加の作業はほとんど必要ありません。 ただし、オプティミスティック コンカレンシー チェックに元の値を使用する必要がある場合、プレゼンテーション層はそれらの値を追跡し、更新時に戻す役割を担います。 これは、プレゼンテーション層のエンティティに加えられた変更が中間層で追跡されないためです。 実際、エンティティの元の取得と最終的な更新は、通常、 DataContextの完全に分離された 2 つのインスタンスによって実行されます。

プレゼンテーション層が行う変更の数が多いほど、変更を追跡して中間層にパッケージ化することが複雑になります。 変更を伝達するためのメカニズムの実装は、アプリケーションによって完全に行われます。 唯一の要件は、LINQ to SQL に、オプティミスティック コンカレンシー チェックに必要な元の値を指定する必要があるということです。

詳細については、「 N 層アプリケーションでのデータ取得と CUD 操作 (LINQ to SQL)」を参照してください。

こちらも参照ください