2012-02-28 9 views
3

私はTaskという名前のエンティティで多対多マッピングを行っています。タスクには多くの子供と多くの親がいることができます。その間に2つのFK列 "ParentTaskId"と "ChildTaskId"を持つ結合テーブルがあります。これまで私が思いついたことがあります。HasManyToMany Fluent NHibernate Mapping Delete Error

 // Many-to-Many Parents 
     HasManyToMany<Task>(x => x.Parents) 
      .Table("TaskDependency") 
      .ParentKeyColumn("ParentTaskId") 
      .ChildKeyColumn("ChildTaskId") 
      .Inverse() 
      .Not.LazyLoad() 
      .Cascade.SaveUpdate(); 

     // Many-to-Many Children 
     HasManyToMany<Task>(x => x.Children) 
      .Table("TaskDependency") 
      .ParentKeyColumn("ChildTaskId") 
      .ChildKeyColumn("ParentTaskId") 
      .Not.LazyLoad() 
      .Cascade.SaveUpdate(); 

ここに私の質問を説明するためのコード例があります。

 _taskRepository.Save(_taskVendor); 
     _taskRepository.Save(_taskClientVendor); 
     _taskRepository.Save(_taskClient); 

     _taskVendor.Children.Add(_taskClientVendor); 
     _taskClientVendor.Children.Add(_taskClient); 
     _taskRepository.Save(_taskVendor); 
     _taskRepository.Save(_taskClientVendor); 

     _taskRepository.Delete(_taskVendor); 
     _taskRepository.Delete(_taskClientVendor); 
     _taskRepository.Delete(_taskClient); 

をしかし、私はDELETE文の順序があることを変更した場合:次のコードは動作します

 _taskRepository.Delete(_taskVendor); 
     _taskRepository.Delete(_taskClient); 
     _taskRepository.Delete(_taskClientVendor); 

私はテーブルを結合する多くの私の多くのFK制約違反を取得します。私はこれが私のマッピングに逆の設定をしたやり方と関係していると思います。この正確なfk制約の問題を避けるために、クエリが実行される順序に影響します。この例外を発生させることなく、どちらかの側(子または親)のエンティティを削除できるように、これをマップする方法はありますか?私はマッピングの両面を逆にしようとしましたが、それはちょうど私の多対多の関係が救われていないという結果に終わりました。 > _ <

ご協力いただければ幸いです。

答えて

3

手動で

void Delete(Task task) 
{ 
    foreach (var parent in task.Parents) 
    { 
     parent.Childs.Remove(task); 
    } 
    session.Delete(task); 
} 
+0

いやはや、それらを削除する必要があります!もちろん... ...助けてくれてありがとう。ただ好奇心から、そのマッピングは正しそうに見えます(マッピングの反対側を逆に動かすことは別として)? –

+0

私に良く見えます – Firo

+0

これは私が最終的に終わったものです:public override void Delete(タスクタスク) { タスクparentTask; foreach(task.Parentsのvar parent) { //子を削除する前にすべての親関係を削除する必要があります。 parentTask = this.Fetch(parent.Id); parentTask.Children.Remove(task); 保存(parentTask); } //この行は最終的にsession.Delete(タスク)を呼び出します base.Delete(タスク); } –