2008-08-05 9 views
25

ASP.net 3.5アプリケーションでLinqToSqlを完全に使用するには、DataContextclasses(通常はVS 2008のデザイナーを使用して作成されます)を作成する必要があります。 UIの観点から見ると、DataContextはLinqToSqlを通して公開したいデータベースのセクションの設計であり、LinqToSqlのORM機能の設定に不可欠です。複数のDataContextクラスはこれまでどおり適切ですか?

私の質問は:すべてのテーブルが外部キーを介して何らかの方法で相互接続されている大規模なデータベースを使用するプロジェクトをセットアップしています。私の最初の傾向は、データベース全体をモデル化する1つの巨大なDataContextクラスを作ることです。理論的にはそうすることができますが(実際にはこれが必要かどうかは分かりませんが)、LinqToSqlで生成された外部キー接続を使用して、コード内の関連オブジェクト間を簡単に移動したり、関連オブジェクトを挿入したりできます。

しかし、考えてみたら、データベース内の特定の名前空間または論理的に関連するセクションに関連する複数のDataContextクラスを作成する方が意味があると考えています。私の主な関心事は、データベースの特定の領域に関連する個々の操作のために常に1つの巨大なDataContextクラスをインスタンス化して処理することは、アプリケーションリソースに不必要な面倒を課してしまうことです。さらに、小さなDataContextファイルを作成して管理する方が、1つの大きなファイルよりも簡単です。私が失うのは、LinqToSqlを介してナビゲートすることができない、データベースのいくつかの遠い部分があるということです(たとえ関係のチェーンが実際のデータベースにそれらを結びつけても)。さらに、複数のDataContextに存在するいくつかのテーブルクラスが存在します。

1つの非常に大きなDataContextクラス(DB全体に対応)の代わりに(またはそれに加えて)複数のDataContext(DB名前空間に対応する)が適切であるかどうかについての考えや経験はありますか?

答えて

24

私はジョンの答えには同意しません。 DataContext(またはLinq to Entities ObjectContext)は、接続よりも「作業単位」のほうが多いです。変更の追跡などを管理します。詳細については、このブログ記事を参照してください。

Lifetime of a LINQ to SQL DataContext

このブログの記事の4つの主要なポイント

がDataContextのことです:

  1. は理想的な「作業単位」の を適しているのアプローチ
  2. "ステートレス"サーバー操作
  3. のために設計されていません のために設計されていません長寿命の使用
  4. Should be used very carefully after 
    any SumbitChanges() operation. 
    

私はあなたのLinqToSqlのimpelmentationがよりusuableと整理に役立つだろう仕事の種類ごとに異なるのdatacontextsを作成し、実際にはどんなのHARMを行うだろうつ以上のDataContextを使用してとは思わない、ということを考えると。唯一の欠点は、sqlmetalを使用してdmblを自動生成できないことです。

1

LINQ to SQLとLINQ to Entitiesでの私の経験では、DataContextはデータベースへの接続と同義です。したがって、複数のデータストアを使用する場合は、複数のDataContextを使用する必要があります。私の欠点は、大量のテーブルを含むDataContextを使用すると、速度が低下することに気付かないことです。ただし、他のテーブルセットと関係のないテーブルを分離して複数のコンテキストを作成できるような場所では、データベースを論理的に分割することができます。

4

レガシーDBを介してLINQをSQLにレトロフィッティングしながら、私は同じ質問に悩まされていました。私たちのデータベースは少し冗談(150テーブル)で、いくつかの考えと実験の後、私は複数のDataContextを使用することを選んだ。これがアンチパターンと見なされるかどうかはまだ分かりませんが、今のところそれは人生を管理しやすくしています。

3

ジョンは正しいと思います。

「私の主な関心事は、データベースの特定の領域に関連する個々の操作のための1つの巨大なのDataContextクラスをインスタンス化し、廃棄すると、すべての時間は、アプリケーションのリソースに不要な賦課を課すことになるということである」

あなたはどのようにすることをサポートしていますステートメント?大きなDataContextがパフォーマンスのボトルネックであることを示す実験は何ですか?複数のデータコンテキストを持つことは、複数のデータベースを持つようなものであり、似たようなシナリオでは意味がありません。複数のデータコンテキストで作業している場合は、どのオブジェクトがどのdatacontextに属しているかを追跡し、同じデータコンテキストにないオブジェクトを関連付けることはできません。それは本当の利益のための高価なデザインのにおいです。

@Evan "DataContext(またはEntity ObjectContext)は接続よりも"作業単位 "です。" これは、複数のdatacontextを持たない理由です。なぜあなたは一度にもっと多くの「作業単位」を望んでいますか?

+0

はい、大きなDCがインスタンス化に時間がかかると仮定するとOPが正しくありません。実際、実行中のプロセスで最初のインスタンスが作成された後、同じDCの後続のインスタンスがほぼ即座に作成されます。 –

3

私は受け入れられた答えに同意しなければなりません。問題は、システムにはほとんどすべてのテーブル間の強い外部キー関係を持つ1つの大きなデータベースがあります(私が働いている場合も同様です)。

  1. あなたは、いくつかのテーブル間の関係を失う:このシナリオでは、小さい方のdatacontexts(DC者)にそれを分割すると、2つの即時かつ大きな欠点(問題が言及したの両方)を持っています。 DC境界を賢明に選択することはできますが、最終的には、あるDCのテーブルから別のDCのテーブルへの関係を使用するのが非常に便利な状況に遭遇します。
  2. 一部のテーブルは複数のDCに表示されることがあります。これは、テーブル固有のヘルパーメソッド、ビジネスロジック、またはその他のコードを部分クラスに追加する場合、そのタイプはDC間で互換性がないことを意味します。これを回避するには、各エンティティクラスを固有の基本クラスから継承してください。これは面倒です。また、スキーマの変更は、複数のDCにまたがって複製する必要があります。

これらは重大な欠点です。それらを克服するのに十分大きな利点がありますか?質問はパフォーマンスを言及:

私の主な関心事は、データベースの特定の領域に を関連付ける個々の操作のための1つの巨大な のDataContextクラスをインスタンス化し、廃棄すると、すべての時間は、アプリケーションのリソースに不要な 賦課を課すことになるということです。

実際には、大規模なDCは、典型的な作業単位でインスタンス化または使用するまでにかなりの時間がかかります。事実、after the first instance is created in a running process, subsequent copies of the same DC can be created almost instantaneously

徹底した外部キ​​ー関係を持つ単一の大きなデータベースに対する複数のDCの唯一の利点は、コードを少しコンパクトにすることができることです。しかし、あなたはすでに部分クラスでこれを行うことができます。

また、作業単位の概念は元の質問と実際には関係ありません。作業単位は、通常、DC クラスがやってのできるありませんどのくらいの仕事、やっているどのくらいの仕事単一DC インスタンスを指します。

関連する問題