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;
}
}
}