2010-12-02 48 views
0

我有一個NHibernate多對多關係。在將項目添加到關係之前,我想測試該項目是否已存在於集合中。我的添加方法看起來像當NHibernate使用代理元素填充MyList時,你如何使用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不能用於子類。

我已經在課程集合上禁用了延遲加載,並且代碼工作正常。

那麼,你如何做到這一點與惰性加載對象?使用Course的獨特性能

if (!this.Courses.Any(r => r.GetHashCode() == course.GetHashCode())) 
  • 檢查:

  • 回答

    1

    現在不能測試它在我的機器上,但有一些想法:

    1. 檢查使用的GetHashCode。例如,ID:

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

    兩個表達式使用System.Linq命名空間(不要忘記之前把它列入)。恕我直言,第二個例子是更好的。

    +0

    我已經使用這種方法的時間,但它仍然感覺像一個黑客。 – 2010-12-14 12:20:38

    0

    嗯......

    原諒我的VB,但你有沒有試圖做的元素的手動checkthrough?即

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

    這些顯式調用列表中的每個項目可能會強制項目被正確加載。

    我認爲這裏的關鍵在於,您需要對列表中的元素進行「精力充沛」的調用,以克服懶惰,儘管我猜你知道這一點。我認爲這或多或少是天才的回答所要做的,但我並不確定。

    相關問題