2012-01-12 21 views
6

だからここに私の状況です:Entity Frameworkの、ソフト削除およびクエリ

は私のアーカイブされたデータの痕跡を保つことができるように私は、ソフトの削除IsDeletedフラグを使用して、テーブル内の一部の行です。私はObjectContextSaveChangesステートメントを無効にすることでそうしています。

質問は:すべてのクエリで&& !IsDeletedを指定することなく、IsDeleted == falseを持つ行のみを選択するにはどうすればよいですか?

これを自分のコンテキストで直接指定する方法はありますか?

tkx! ActiveDataビューの代わりに、ベース・テーブルからデータを読み込み、

CREATE VIEW dbo.ActiveData 
AS 
    SELECT (list of columns) 
    FROM dbo.YourTable 
    WHERE IsDeleted = 0 

そして、あなたのEDMXモデルに:

+0

EFコードファーストまたはモデル最初:

は、詳細は以下を参照してください? – StriplingWarrior

+0

フラグの代わりに、表を使用してください。削除されたテーブルの場合、PKはメインテーブルと同じPKになり、削除されたテーブルのPKはFKでメインテーブルに格納されます。あなたが削除されたレコードを持っていれば、そのレコードは削除されます。それから、ちょうど簡単な参加です。クエリのパフォーマンスは、ビットフラグを使用するよりも優れています。 –

+0

@ JonRaynor:データベースは私の専門ではありませんが、ビットフラッグをチェックすることは、ジョインするよりもはるかに安価でなければならないと思います。特に、通常どの項目を知ることにもっと関心を持つので、 *削除されていないため、削除されたテーブルには存在しません。ビットフラグがクエリのパフォーマンスを傷つけている場合は、完全に別のテーブルを作成するよりもインデックスを優先します。 – StriplingWarrior

答えて

7

あなたはあなたのテーブルの上にビューを定義し、代わりにそのビューを照会できます。

6

モデルビューアでエンティティセットを右クリックし、[テーブルマッピング]をクリックすると、「条件を追加」できる領域があります。これはあなたが求めていることを行うはずですが、marc_sの提案に従って、代わりにViewを使う方が良いかもしれません。

+0

条件付きマッピングはEFに入る正しい方法です。 @marcとして表示を使用することは推奨されますが、追加の変更が必要になります。 –

+0

物理的なedmxなしで、コードファーストで条件付きマッピングを行う方法はありますか? – danludwig

+0

@olivehour:http://stackoverflow.com/questions/8161689/entity-framework-conditional-mapping-with-code-first – StriplingWarrior

1

これは今のところ古い質問ですが、ここに新たに来る人は誰でも可能です。 EF 6では、このタイプの問合せにインターセプタを使用する必要があります。 SQLクエリーの内部にクエリーを配置し、フラグに基づいてレコードをフィルターします。

Soft Deleting Entities using Interceptors