3

EF5 を使用するアプリケーションでレコードをソフト削除するコードがいくつかあります。私の「削除可能な」クラスは、ISoftDelete を実装しています。これは、単に実装者が bool の Deleted プロパティを持っている必要があることを示しています。

ユーザーが削除をクリックすると、DbContext..Remove(entity) が呼び出されます

これにより、親エンティティにバインドされているすべてのプロパティが null にクリアされます (親が削除可能なエンティティのコレクションを持っている場合!)。

私の DbContext では、SaveChanges メソッドをオーバーライドして削除されたエンティティを見つけます。それらが ISoftDelete インターフェイスを実装している場合は、状態を削除ではなく変更済みに設定し、その Deleted プロパティを true に設定して削除済みとしてマークします。私の問題は、親への参照を保持するプロパティが null であることです。

調査は ApplyOriginalValues を指しているようですが、私の値はパブリック プロパティではなく、コレクション内の子であることによって作成されているため、実装に苦労しています。手伝ってくれますか?

4

1 に答える 1

2

別のアプローチを使用すると、より簡単になる可能性があると思います。EF Context を直接呼び出すのではなく、リポジトリと Unit of Work ファスケード パターンを使用すると、アクションをより簡単に制御できます。作業単位クラスは、savechanges アクションを制御します。リポジトリ クラスは、CRUD、GetLists などを制御します。

   public class RepositoryBase<TPoco> : IRespository {

       public RepositoryBase(DbContext context) { Context = context; }
          //... CRUD methods....
          public bool Remove(TPoco poco) {
                   if (typeof ISoftDelete).IsAssignableFrom(Typeof(TPoco)){
                       // proceed with modify actions
                   }
                   else {
                          Context.Set<TPoco>().Remove(poco);
                   }
          }
   }

   public class Luw : ILuw{
         // ....
          public IRepositoryBase<TPoco> GetRepository<TPoco>() where TPoco : ???{
              return (new RepositoryFactory<TPoco>().GetRepository(Context));
         }

  public MuCustomResult  Commit() {
          .... any special context manipulation before save
          myCustomResultRecordsAffected = Context.SaveChanges();

  }
}
于 2013-08-30T00:12:02.803 に答える