元に戻す目的で論理的な削除を実装しました。私の答えは、論理的な削除に通常関連するいくつかの問題、つまり結合とインデックスを克服する方法を示しています。それは私の目的によく合っています。ただし、アーカイブに使用すると、テーブルが無限に大きくなります。
もう 1 つのアイデアは、重複したクラスを作成し、automapper を使用することです。それは多くの余分なコーディングのように聞こえます。
同じスキーマでデータベースを作成できると思いますが、おそらく主キーはデータベースで生成されず、外部キーは強制されません。次に、削除をオーバーライドして、データがコピーされるようにします。
このようなもの:
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries()
.Where(p => p.State == EntityState.Deleted
&& p.Entity is ModelBase))//I have a base class for entities with a single
//"ID" property - all my entities derive from this
CustomDelete(entry);
return base.SaveChanges();
}
private void CustomDelete(DbEntityEntry entry)
{
var e = entry.Entity as ModelBase;
string tableName = GetTableName(e.GetType());
string sql = String.Format(@"INSERT INTO archive.{0} SELECT * FROM {0} WHERE ID = @id;
DELETE FROM {0} WHERE ID = @id", tableName);
Database.ExecuteSqlCommand(
sql
, new SqlParameter("id", e.ID));
entry.State = EntityState.Detached;
}
EF6 では、ストアド プロシージャへのマッピングが使用されている場合、移行ファイル内の sql を変更することで、削除をオーバーライドすることもできることに注意してください。