2012-03-11 8 views
1

いくつかの要件を持つデータモデルがあります。私は、EFを使用している間、これらの要件をできるだけ透明にする方法を見つけたいと思います。Entity Frameworkのオーバーライド動作

最初に、モデルはソフト削除をサポートする必要があります。私はこれについていくつかの質問を見てきましたが、私はそれが比較的単純であると思います。

第2に、「挿入のみ」のポリシーがあります。それは更新を意味しません。更新が行われると、代わりに新しいエントリを挿入する必要があります。私はこの操作を更新として扱い、そのフレームワークで背後のインサートに変更させたいと考えています。

第3に、照会するときに#2があるため、ID列を降順で並べ替えて最初のレコードのみを返す必要があります。多くのレコードを返すクエリを実行する場合でも。基本的に、これはバージョン履歴を作成します。

第4に、各クエリでこのロジックを実装する必要はありません。私たちが各クエリを通常のCRUD型のトランザクションであるかのように扱うことができるように、フレームワークがそれを行うのはいいことです。

EFでこのようなデータモデルを実装した人はいますか?どんなテクニックを使いましたか?

これはビューやSprocsで行うことができますが、ビューを使用する場合は、すべてのリレーションシップを手動で維持する必要があります(EFはビューを通してリレーションシップを読み取ることができません)。トリガーも可能ですが、私たちのDBAは可能な限りトリガーを欲しがらず、達成に長時間かかるすべてのトリガーについて非常に広範なレビューポリシーを持っています。もし私がする必要がなければ、私はむしろトリガーを使用しないだろう。

私は主にデータベースの第1のアプローチで作業しますが、私はdbcontextを使用します。

EDIT:

以下ラディスラフのコメントを考えると、私はまた、これらの要求を処理することができるかもしれない他のORMのについてのコメントに興味があると思います。

+0

#4では、これを特定のエンティティに実装したいと思うようですが、常にクエリごとに行うのではないでしょうか?だから、エンティティクラスの設定可能なプロパティにする必要がありますか? –

+0

@GertArnold - 私はあなたの質問を理解していません。エンティティはPOCOであるため、それらを満たすために使用されるクエリのロジックを制御しません。 –

+0

いくつかのクラスに定期的な更新と監査された「挿入のみ」の更新(どこにでも設定可能)を追加したいと思っていました。おそらくそうではありません。 –

答えて

1
  1. これは、追加の列が削除されたレコードを異なるように使用される条件のマッピングを有することが可能であるとcustom SQL command /ソフト更新の代わりに削除を実行するために削除する必要すべてのエンティティのためのストアドプロシージャをマッピングしました。
  2. EFがこれを透過的に処理するかどうかは疑問です。データベースから読み込まれた添付のインスタンスを変更すると、更新が実行されます。ストアドプロシージャを再度マップして、更新ではなく挿入を実行できますが、その変更はアプリケーションロジックに反映されません。新しいコンテキストインスタンスでコンテキストを破棄してデータを再読み込みし、変更を正しく表示する必要があります。より良いオプションは、アプリケーションをどこかで強制的にエンティティをクローンし、クローンを新しいものとして挿入することです。
  3. EFでは、ビューまたはcustom SQL queryとしてマップしない限り、自動生成されたクエリにそのような条件を透過的に追加することはできません。ビューまたはSQL問合せを使用したら、挿入、更新および削除操作からのSQLコマンドまたはストアド・プロシージャも使用する必要があります。カスタムSQLクエリを使用するとビューを使用するのと同じ欠点があります。
  4. SQLクエリを使用しない場合は、たとえば独自の再利用可能な拡張メソッドの形式でクエリを記述し、どこでも使用する必要がありますが、熱心な読み込みや遅延読み込みには反映されません。熱心で怠惰な読み込みの場合は、常にすべてのバージョンを取得します。

ストアドプロシージャマッピングにはEDMXが必要です。カスタムSQLコマンドとクエリマッピングにはEDMXが必要で、他の商用ツールがなければ、EDMXを手動で維持する必要もあります。

+0

これは残念です。このシナリオに適した他のORMについて知っていますか? nHibernateでこれを処理できますか? –

+0

すべてをカバーするわけではありませんが、それでも面白いです:http://stackoverflow.com/questions/9199078/intercepting-nhibernate-persistence-operations-on-icollections-properties-many –