0

私の問題は..

ユーザーに、レコードを削除するかどうかを尋ねます。彼がそう言うなら、

実際にテーブルから行を削除するつもりはありませんが、テーブルの Deleted 列を true で更新します。ただし、これを行う前に、行の削除の場合と同様に、外部キー制約を確認したいと思います。つまり、値が他のテーブルで使用されているかどうかを意味します。この行は他のテーブルで使用されているため、削除できないとユーザーに言う必要がありますか?

どうすればこれを行うことができますか?

現在、私は削除するためにこれを行っています..

public bool Delete(dynamic entity)
{
    try
    {
        //here I want to check, whether this is being used by some other table or not. Foreign key constaint
        entity.Deleted = true;
        this.SaveChanges();
        return true;
    }
    catch { return false; }
}
4

3 に答える 3

1

私の答えは、エンティティ フレームワーク 5.0 と Code First に適用されます。このソリューションには 2 つの部分が必要です。まず、各データ クラスは、'Deleted' プロパティ (IVirtualDelete と呼びましょう) を公開するインターフェイスを実装する必要があります。

public interface IVirtualDelete{
  bool Deleted {get; set;}
}

次に、DBContext で SaveChanges メソッドをオーバーライドする必要があります。

SaveChanges が呼び出されたら、context.ChangeTracker.Entities() を調べて、状態が System.Data.EntityState.Deleted であり、Entity が IVirtualDelete インターフェイスを実装しているものを探します。オブジェクトに Deleted を設定し、エンティティの状態を Modified に変更します。

public override int SaveChanges() {
  foreach (var item in this.ChangeTracker.Entries().Where(x=> x.EntityState == EntityState.Deleted)){
    var entity = item.Entity as IVirtualDelete;
    if(entity != null){
      entity.Deleted = true;
      item.EntityState = EntityState.Modified;
    }
  }
  return base.SaveChanges();
}
于 2013-02-01T21:29:59.203 に答える
0

そしてそれは「それについて」です。EFには、削除を更新にオーバーライドする方法がありません。最後に、メカニズムが異なる可能性があるため(削除のタイムスタンプなど)、これは適切ではないと主張できます。ですから、あなたがすることは、この場合、人々がすることです。

于 2012-12-30T21:39:15.123 に答える
0

エンティティの主キーの値を変更して保存してみてください。

子レコードが存在する場合、何らかのカスケード更新エラーが発生し、false が返されます。

更新が成功した場合 - 子レコードがない場合は、主キーの値を元に戻し、Deleted = true に設定して再保存できます。

もちろん、主キーとして ID を持っている場合、または「カスケード削除」ユーザー可視シナリオを持つ子テーブルがある場合、これは当てはまりません。

于 2013-03-13T11:33:05.460 に答える