2010-12-02 7 views
0

NHibernateの多対多の関係があります。リレーションシップにアイテムを追加する前に、そのアイテムがコレクションにすでに存在するかどうかをテストしたい。 Addメソッドは次のようになりますNHibernateがMyListにProxy要素を設定するとき、MyList.Contains(MyObject)をどのように使用しますか?

public virtual void AddCourse(Course course) 
{ 
    if (!this.Courses.Contains(course)) 
    { 
     course.Students.Add(this); 
     this.Courses.Add(course); 
    } 
} 

Courses.Contains(course)ステートメントは常に失敗します。私はいくつかの掘り下げを行ったし、コースのリストは、私のドメインオブジェクトではないNHibernateのプロキシのリストであることに気づいた。私の正気のために、私は平等が正しく働くように設定されていることを示したテストをノックしました。このテストでは、Containsがサブクラスで動作しないことも示されています。

コースコレクションでレイジーローディングを無効にしていて、コードが正常に動作しています。

レイジーロードされたオブジェクトではどうしますか?

答えて

1

は私のマシン上で、今それをテストしますが、いくつかのアイデアを持っていません:GetHashCodeメソッドを使用して

  1. チェック:Courseのユニークな性質を利用して

    if (!this.Courses.Any(r => r.GetHashCode() == course.GetHashCode())) 
    
  2. チェック。例えば、Idは:

    if (!this.Courses.Any(r => r.Id == course.Id)) 
    

両方の式がSystem.Linq名前空間を(前にそれを含めることを忘れないでください)を使用しました。 IMHO、2番目の例が優れています。

+0

私はこの方法で時間を過ごしましたが、まだハックのように感じます。 –

+0

これが機能する場合は、これが解決策です。それは、ハックや「blablasoftのベストパターンと実践などによって認定され、承認されても」です。 – Genius

0

うーん...

恩赦私のVBができますが、要素の手動checkthroughをやって試してみましたか?すなわち

For Each itemIn In me.Courses 
    If itemIn Is course 
     course.Students.Add(this); 
     this.Courses.Add(course) 
    End If 
Next 

これらのリスト内の各項目への明示的な呼び出しによって、項目が正しく読み込まれる可能性があります。

私はあなたがこれを知っていると思いますが、怠け者を克服するためにあなたのリストの要素を十分に呼び出す必要があるということです。私は、天才の答えがやろうとしていることは多かれ少なかれだと思いますが、私は絶対に確信していません。

関連する問題