1

Breezejs がこのリンクからカスケード削除をまだサポートしていないことがわかるまで、それは大きな頭痛の種でした。カスケード削除制約をデータベース テーブルに直接追加することで、この制限を回避しようとしました。ただし、そよ風でも機能していないようです(親行を手動で削除すると機能します)。私の観察によると、そよ風が親行を削除すると、子の外部キーが null に設定されます。何か案が?

ちなみに、削除時に簡単に例外がスローされるのを避けるために、外部キーを null 許容にする必要がありました。また、エンティティ フレームワークでカスケード削除をオフにする必要があります。

4

1 に答える 1

1

この質問は数か月前のものであることは知っていますが、解決策を探しているときにこの質問に何度も出くわしたので、誰かを助けるかもしれません. これは私がうまくやってのけた回避策です(完全にはテストされていませんが、最初のいくつかのテストでは機能します)。

親クラスParentと子クラスがあるとしChildます。子は、親が存在する場合にのみ存在できます。

Context クラス (protected override void OnModelCreating(DbModelBuilder modelBuilder)関数を配置するクラス) では、次のように記述します。

public override int SaveChanges(){
  foreach (var entry in this.ChangeTracker.Entries().Where((e => (e.State == (EntityState)Breeze.WebApi.EntityState.Deleted))))
    {
      if (entry.EntityType.GetType() == typeof(Parent)){
        var entity = entry.Entity as Parent;
        var allChildren = Children.Where(p => p.ParentId == entity.Id);
        foreach (var singleChild in allChildren){
          Children.Remove(singleChild);
        }
      }
    }
  }
  return base.SaveChanges();
}

欠点は、カスケードが通常発生するすべての単一の削除に対してこれを記述する必要があることです。また、Toy親クラスを持つクラスを配置する場合は、そのクラスChildにも手動で対処する必要があることに注意してください。

于 2013-11-15T15:35:30.533 に答える