これが問題かどうかはわかりませんが、スタブ オブジェクトを使用してエンティティを削除する場合は、DbEntityEntry.State
代わりに を削除済みに設定してみてください。validateOnSaveEnabled
電源を切る必要があるかどうかさえわかりません。
public void Delete<TEntity>(TEntity entity) where TEntity : class, IEntity
{
this.Configuration.ValidateOnSaveEnabled = false;
TEntity alreadyAttached = this.Set<TEntity>().Local
.FirstOrDefault(d=>d.Id == entity.Id);
if(alreadyAttached != null) entity = alreadyAttached;
this.Entry<TEntity>(entity).State = EntityState.Deleted;
SaveChanges();
this.Configuration.ValidateOnSaveEnabled = true;
}
編集
上に書かれていることは、完全に正しいとは限りません。Pawel が指摘したように、それはDbUpdateException
notDbEntityValidationException
です。上記がうまくいく理由は、エンティティが添付されている場合のケースの処理です。
if(!this.Set<TEntity>().Local.Any(d=>d.Id == entity.Id))
{
this.Set<TEntity>().Attach(entity);
}
this.Set<TEntity>().Remove(entity);
エンティティが既にアタッチされている場合を考えてみましょう。渡されたエンティティのインスタンスではなく (ID を比較しているだけです)、同じエンティティを表す別のインスタンスです。ここで、この時点より前にコードのどこかでこの他のエンティティを変更した場合、変更されたとしてコンテキストによって追跡されることを検討してください。次に、エンティティの渡されたインスタンス (追跡されていないインスタンス) を削除しようとしますが、結果としてノーオペレーションになります。次に、savechanges と BAM! を呼び出します。DbUpdateException
削除したと思われるエンティティを EF が更新しようとするためです。