1

EntityFrameworkのソフト削除のエレガントな方法は何ですか?プロパティ(データベースフィールド)を削除済みとして既に識別しており、linqステートメントで常にこのフィルターを使用します。

好き

Foo Class  
  int NumberField  
  string Description 
  bool Deleted

contexts.Foos.Where(x=> !x.Deleted);

複雑なクエリでは実行できません。

私はちょうどこれらの解決策を見ました.. リンク1リンク2

助けていただければ幸いです。

4

5 に答える 5

2

はい、これはパターン経由の EF で可能です。Fascade/repository パターンを使用し、その fascade を介して毎回アクセスする場合。

たとえば、すべてのリポジトリ クラスでのインターフェイスの実装は次のようになります。

 class MyRepositoryBase<T>....

    public IQueryable<T> ValidQuerySet  // this is not deleted check  Set

    {  get {  return Context.Set<T>().Where(t => t.deleted != true);
           }
    }

元の DbSet であるかのように正確にアクセスできます。EFは条件を組み合わせます。

var myQuerySet = MyRespository<T>.ValidQuerySet.Where(t=>t.foo == "bar");
于 2013-02-19T14:33:15.647 に答える
1

コンテキストを直接クエリする代わりに、コンテキスト クラス自体にリポジトリを作成することを検討することをお勧めします (このサイトにあるように)。次にできることは、レコードを照会するときはいつでも(Filter<T>(Expression<Func<T, bool>> predicate)リポジトリのメソッドを使用するなどして、いつでも次のことができます:

return Context.Set<Foo>().Where<Foo>(x => !x.Deleted).Where<Foo>(predicate).AsQueryable<Foo>();

そのソフト削除を複数のオブジェクト型で実装し、それを抽象クラスにプルする (SoftDeleteableたとえば、それを呼び出す) 場合、さらに良いことは、 Filter メソッドのシグネチャが次のようになる可能性があることです。

public virtual IQueryable<T> Filter<T>(Expression<Func<T, bool>> predicate) where T : SoftDeletable
于 2013-02-19T14:27:38.530 に答える
-1

このように「ソフト削除」を行うのは非常に苦痛だと思います。

  1. データアクセスを行うときは、どこでもこのフラグを覚えておく必要があります。はい、リポジトリパターンをラップすることはできますが、それでもどこにでもあります。
  2. テーブルはすぐに「削除された」エントリでいっぱいになり、レポートや分析が効率的になりません。

ハードな「削除済み」エントリを別のテーブルまたはデータベースに配置することをお勧めします。これにより、長期的には時間を節約できます。

于 2013-02-19T16:07:16.647 に答える