他の DataContext 内のエンティティへの LINQ-to-SQL 参照
-
22-09-2019 - |
質問
私のデータベース設計では、テーブルの「クラスター」を作成する傾向があります。これらのクラスターは通常、1 つのアプリケーション、または機能的に密接に関連したアプリケーションのグループをサポートします。多くの場合、これらのクラスターは、比較的少数の外部キーを通じて相互に関連付けられます。これは、ビジネス内の独立したアプリケーションを相互に統合するのに役立ちます。
たとえば、次のようになります。「Foo」、「Bar」、「Baz」というアプリケーションがあり、それぞれに複数のテーブルがあると想像してください。テーブルとその外部キー参照のリストは次のとおりです。
- FooTableOne
- FooTableTwo -> FooTableOne
- BarTableOne -> FooTableTwo
- BarTableTwo -> BarTableone
- バズテーブルワン
- BazTableTwo -> FooTableTwo、BazTableOne
現在、LINQ-to-SQL を使用してこれらのテーブルにアクセスしています。各クラスター (Foo、Bar、Baz) に個別のプロジェクトがあり、これらの各プロジェクトにはクラスター内のすべてのテーブルの .dbml があります。ここでの考え方は、クラスターを使用する各 (1 つ以上の) アプリケーションが、必要な LINQ クラスを含む共有ライブラリをインポートできるということです。
これは良いアイデアかもしれないし、そうでないかもしれません。のように見えます 陪審 は まだ 外. 。私が本当に疑問に思っているのは、異なるコンテキスト クラスに存在する場合でも、別のクラスター内のクラスによって表現されるクラスター間の参照を持つことができるかどうかです。(さらに具体的には、Visual Studio でこの関係を作成する方法)。
例に戻って、次のようにしたいと思います。
- プロジェクト・フー
- Foo.dbml
- FooDataContext
- FooTableOne
- FooTableOne.FooTableTwos
- FooTableTwo
- FooTableTwo.FooTableOne
- FooTableTwo.BarTableOnes (これはそれほど重要ではありません)
- FooTableTwo.BazTableTwos (これはそれほど重要ではありません)
- プロジェクトバー
- バー.dbml
- バーデータコンテキスト
- バーテーブルワン
- BarTableOne.FooTableTwo
- BarTableOne.BarTableTwos
- バーテーブル 2
- BarTableTwo.BarTableOne
- プロジェクト・バズ
- Baz.dbml
- BazDataContext
- バズテーブルワン
- BazTableOne.BazTableTwos
- バズテーブルツー
- BazTableTwo.FooTableTwo
- BazTableTwo.BazTableOne
アウトオブコンテキスト エンティティへの参照はすべて、オブジェクトではなく単純な ID (int) であり、アウトオブコンテキスト エンティティへのコレクションはまったく存在しません。これらのクラスに独自のメソッドを追加して、(コンテキストのインスタンスを指定して) 適切な検索を実行できることはわかっていますが、もう少し合理化して一貫性を持たせたいと考えています。
このコンテキスト/クラスターの分離により、アプリケーション間でモジュール性が得られることに注意してください。したがって、たとえば、Baz アプリケーションは、Baz コンテキストと Foo コンテキスト (Baz は Foo に依存しているため) のみをインポートする必要がありますが、Bar はインポートする必要はありません。(これは、Foo に Bar エンティティのコレクションがないことを前提としていますが、私にとっては問題ありません)。これは良いことですが、重要ではありません。LINQ/VS でこれが簡単にできない場合は、モジュール性を廃止して 1 つの大きなコンテキストを使用することを検討します。
解決
L2SことはできませんDBMLファイル間でモデルの関係。 IMO、これはL2Sの主な欠点です。 私は、我々のアプリケーションではこれで苦労しました。私たちは別々のDBMLファイル内のすべてのエンティティを持っています。各DBMLファイルには、我々のアプリケーションで名前空間を表し、そして私たちのSQL Serverデータベースでのスキーマます。
だから、私は何をやってしまったことは別の名前空間の外国の関係を表しているプロパティを持つ各エンティティのためですが、私は模倣L2S協会属性という、部分クラス内のプロパティでカスタム協会属性を置きます。このカスタム属性は、私たちは自分自身の関係を管理することができます。なく、かなりL2Sを持つように効率的にそれを行うが、それは私たちのためにかなりうまく機能してます。
ランディ