4

ドメインモデルがテーブル駆動型でない場合、つまりドメインオブジェクトがデータベーススキーマと一致しない場合に、POCOをLinq-to-Sqlで機能させる方法を見つけるのに苦労しています。

たとえば、私のドメインレイヤーには、RecurrenceタイプのRecurrenceプロパティを持つAppointmentオブジェクトがあります。これは、特定の再発パターンに基づいたいくつかのサブクラスを持つ基本クラスです。

私のデータベースでは、Appointmentレコードとその繰り返しの間に常に1対1の関係がある場合、個別のAppointmentRecurrencesテーブルを持つことは意味がありません。したがって、AppointmentsテーブルにはRecurrenceType列とRecurrenceValue列があります。RecurrenceTypeは、RecurrenceTypesテーブルと外部キーの関係にあります。これは、Recurrence Type(パターン)とAppointmentsテーブルの間に1対多の関係があるためです。

Linq-to-Sqlでこれら2つのモデル間に適切なマッピングを作成する方法がない限り、コードのインピーダンスの不一致を手動で解決する必要があります。

これは、仕様パターンを使用してデータベースにクエリを実行する場合、さらに困難になります。たとえば、現在の予定のリストを返したい場合は、次の式を使用する仕様オブジェクトを簡単に作成できますappt => appt.Recurrence.IsDue。ただし、式のソースタイプはL2Sが認識するものではないため(たとえば、L2Sエンティティではないため)、これはLinq-to-SQLスペースに変換されません。

では、ドメインモデルをサポートするためにLinq-to-SQLで複雑なマッピングを作成するにはどうすればよいですか?

または、この場合、仕様パターンを実装するためのより良い方法はありますか?ドメインオブジェクトとL2Sエンティティの両方で(パーシャルを介して)実装されるインターフェイスを使用することを考えましたが、2つのオブジェクトグラフのインピーダンスの不一致では不可能です。

提案?

4

2 に答える 2

3

残念ながら、Linq to SQL ではテーブルごとのクラス モデルが強制され、単一のエンティティ クラスを複数のデータベース テーブルにマッピングすることはサポートされていません。

さらに残念なことに、より複雑なマッピングをサポートする ORM はほとんどなく、まともな LINQ サポートを提供する ORM はほとんどありません。私がリモートで確信しているのはNHibernateだけです(エンティティフレームワークでの私たちの経験では、この点でL2Sよりも優れているとは言えません)。

また、LINQ 式で仕様パターンを使用しようとするのは非常に困難です。

ORM を使用した場合でも、NHibernate のような非常に強力な抽象化 ORM を使用した場合でも、克服すべき大きなインピーダンスの不一致が依然として存在します。

于 2011-04-08T20:19:56.030 に答える
1

この投稿では、linq-to-sql で仕様パターンを使用する方法について説明します。仕様を連鎖さ​​せることで、リポジトリで使用できる式ツリーを構築できるため、linq-to-sql を使用できます。

私はまだ実装を試みていませんが、linq-to-entities バージョンは、現在取り組んでいるプロジェクトの予定リストにあります。

于 2011-04-11T16:26:10.047 に答える