2012-04-26 11 views
1

エンティティデータモデルを使用したWPFアプリケーションがあります。エンティティデータモデルを使用してソフト削除する方法

データベースからの削除ではなく、エンティティの削除時にIsDeletedフラグをtrueに設定したいと思います。

私はここで多くのスレッドを読んでおり、スレッドの多くは、条件付きマッピングを使用して変更関数マッピングを使用することを示唆しています。

私は、IsDeleted = trueの行をフィルタリングするために条件付きマッピングを使用し、素晴らしい動作をします。

しかし、私は修正機能マッピングだけを削除機能に使用したいのですが、プログラムはエラーを出して、SaveChanges()メソッドでも挿入と更新の機能を探しています。

私は削除機能にのみ指定されています。削除、変更、削除のすべてを使用する方法はありますか?

もしそうでなければ、これを達成する他の方法はありますか? P.S.代わりにDeleteトリガーを使うことについて読んでいます。しかし、私たちはモバイルアプリケーション用のプログラムを開発しており、トリガーによってアプリケーションが遅くなる可能性があるので、可能な限り避けたいと思います。

ありがとうございます!

+0

IsDeletedデータベース列、または単にアプリケーションのコンセプトは? – Tyrsius

+0

これらはデータベース列です。しかし、エンティティデータモデルのエンティティのプロパティにマッピングするのではなく、削除されたアイテムをフィルタリングするためにEDMの各エンティティで条件付きマッピングに使用しています。おかげで – Chikakow

+0

関連スレッドはここにあります。 http://sackoverflow.com/questions/7430286/how-do-i-override-deleteobject-in-entity-framework LadislavはModification関数のマッピングについてここで話しています。それは私が問題を抱えていることです。どんな助けも素晴らしいだろう。ありがとう! – Chikakow

答えて

1

私たちは、Entity Framework 4.1ソリューションでソフト/論理削除を実装しました。

私は部分的にこの回答でそれを説明した: Partial Answer

まず、我々はソフト、または論理削除が必要なDB内のすべてのテーブルにIsDeleted列を追加しました。テンプレートでは、私たちはこの行を追加IEnforceLogicalDeleteインタフェースエンティティが定義されているテンプレートで

public interface IEnforceLogicalDelete 
    { 
     global::System.Boolean IsDeleted{ get; set; } 
    } 

に継承を追加しました:

if(entity.Properties.Where(p => p.DeclaringType == entity && (p.Name == "IsDeleted")).ToList().Count == 1){#>, IEnforceLogicalDelete<#} 

これは、企業がEntityObjectから継承した後にインターフェイスを追加します。

これが設定されたら、私たちが行ったコンテキストで、またはContext.OnSavingChangesイベントで独自の保存メソッドを作成します。

私が上に述べたように、すべての変更(挿入、更新、削除)も履歴テーブルに記録した独自のメソッド(SaveChangesWithHistory)を作成しました。

論理削除を実行するには、EntityStateが削除されている状態エントリをすべて取得し、その状態をModifiedに変更し、フラグを設定する必要があります。インタフェースから実装することで、それを必要とするすべてのエンティティで完全な削除を簡単に実行できます。

foreach (ObjectStateEntry entry in this.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Deleted | EntityState.Added)) 
     { 

      if (entry.State == EntityState.Deleted) 
      { 
       if (entry.Entity is IEnforceLogicalDelete) 
        { 
         IEnforceLogicalDelete delete = entry.Entity as IEnforceLogicalDelete; 
         entry.ChangeState(EntityState.Modified); 
         entry.ApplyOriginalValues(delete); 
         delete.IsDeleted = true; 
        } 
       } 

}

関連する問題