DbContext.SaveChanges()
メソッドをオーバーライドし、インターフェイスを実装するエンティティの削除を元に戻すことで、プロジェクトにソフト削除機能を実装しようとしていISoftDelete
ます。
interface ISoftDelete
{
bool IsDeleted { get; set; }
}
このSaveChanges()
メソッドでは、「削除済み」状態にあり、。を実装するすべてのエントリに対してSoftDelete()メソッドを呼び出していますISoftDelete
。
var entries = this.ChangeTracker.Entries().Where(x => (x.State == EntityState.Deleted) && x.Entity is ISoftDelete)
.ToList();
entries.ForEach(SoftDelete);
私のSoftDelete()
方法は次のとおりです。
private void SoftDelete(DbEntityEntry entry)
{
if (entry.State == EntityState.Deleted && entry.Entity is ISoftDelete)
{
entry.Reload();
var entity = (ISoftDelete)entry.Entity;
entity.IsDeleted = true;
entry.State = EntityState.Modified;
}
}
これは、他の何かと1対1の関連付けを持つエンティティに遭遇するまで完全に機能します。その時点で、次のエラーで例外がスローされます。
{"'ChildParent'AssociationSetからの関係は'Deleted'状態です。多重度の制約がある場合、対応する'Parent'も'Deleted'状態である必要があります。"}
そのエンティティのすべての関連付けを取得し、それらの削除された状態も変更する方法はありますか?
実際に関連付けられているエンティティへの参照を取得しようとしましたが、エンティティのはの代わりににEntityState
設定されています。Unchanged
Deleted