1
public void Delete<TEntity>(TEntity entity) where TEntity : class, IEntity
{
    this.Configuration.ValidateOnSaveEnabled = false;
    if (!this.Set<TEntity>().Local.Any(d => d.Id == entity.Id))
    {
        this.Set<TEntity>().Attach(entity);
    }
    this.Set<TEntity>().Remove(entity);
    SaveChanges();
    this.Configuration.ValidateOnSaveEnabled = true;
}

上記のコードは、SaveChanges() で例外をスローします。

[DbUpdateException: Null value for non-nullable member. Member: 'Name'.]

エンティティを削除するときに検証を削除するにはどうすればよいですか?

4

2 に答える 2

2

これが問題かどうかはわかりませんが、スタブ オブジェクトを使用してエンティティを削除する場合は、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 が指摘したように、それはDbUpdateExceptionnotDbEntityValidationExceptionです。上記がうまくいく理由は、エンティティが添付されている場合のケースの処理です。

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 が更新しようとするためです。

于 2013-02-06T03:39:08.947 に答える
1

表示されている例外は検証に関連していません。DbUpdateException であり、検証例外ではありません)。例外メッセージは、保存されているエンティティの Name プロパティが null であるのに、データベース内の列が null 可能でないことを示しています。(検証がオンになっていると、おそらく検証エラーが発生します。無効にしようとしたのはなぜですか?)

于 2013-02-06T17:38:43.423 に答える