0

エンティティデータモデルを使用したWPFアプリケーションがあります。

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

私はここで多くのスレッドを読みましたが、多くのスレッドが条件付きマッピングを使用して変更関数マッピングを使用することを提案しています。

IsDeleted = true行をフィルタリングするために条件付きマッピングを使用しましたが、うまく機能します。

ただし、関数の削除だけに変更関数マッピングを使用したいのですが、プログラムはエラーを表示し、SaveChanges()メソッドでも挿入と更新の関数を見つけようとします。

削除機能のみを指定しました。削除変更機能のみを使用し、すべての挿入、更新、削除を使用する方法はありませんか?

そうでない場合、これを達成できる他の方法はありますか?PS削除トリガーの代わりに使用することについて読みました。ただし、モバイルアプリケーション用のプログラムを開発中であり、トリガーによってアプリケーションの速度が低下する可能性があるため、可能であれば避けたいと思います。

前もって感謝します!

4

1 に答える 1

1

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

この回答で部分的に説明しました: 部分的な回答

最初に、ソフトまたは論理削除を必要とする 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 で独自の保存メソッドを作成するか、Context.OnSavingChanges イベントで作成します。

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

論理的な削除を行うには、EntityState が Deleted のすべての状態エントリを取得し、それらの状態を 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;
                    }
                 }

}

于 2012-09-19T19:03:32.673 に答える