2014-02-14 29 views
1

我有一個對象定義爲這樣:ICollection的<>包含在EF作爲HashSet的失敗

public class QuestionSetAssignee 
{ 
    [Required] 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public virtual ICollection<QuestionSet> QuestionSets { get; set; } 

    public override int GetHashCode() 
    { 
     return Id.GetHashCode(); 
    } 

    public override bool Equals(Object obj) 
    { 
     if (obj == null) 
     { 
      return false; 
     } 

     QuestionSetAssignee qsa = obj as QuestionSetAssignee; 

     return Id == qsa.Id; 
    } 
} 

以下語句:

QuestionSetAssignees.Contains(director) 

public bool isEditable() 
{ 
    ApplicationDbContext db = new ApplicationDbContext(); 
    QuestionSetAssignee director = db.QuestionSetAssignees.Find((int)QuestionSetAssigneeEnum.Director); 

    if (Conference.AcceptingDirectorApplications && QuestionSetAssignees.Contains(director)) 
    { 
     return false; 
    } 

    return true; 
} 

返回false,據我所知,應該返回真實。 (注:Conference.AcceptingDirectorApplications返回true)

如果它不立即清除,導演對象和HashSet的對象來通過爲DynamicProxies(由於EF和對象層次)。

這裏是指揮目標:

enter image description here
(點擊查看大圖)

這裏是QuestionSetAssignees對象:

enter image description here
(點擊查看大圖)

我無法控制QuestionSetAsignees的類型,因爲它是由EF 6提供的(它在模型中聲明爲ICollection。這也意味着我無法提供一個比較對象(就我所知,據我所知)。我想要做的就是能夠比較兩個QuestionSetAsignee對象。我也嘗試過實現IEquatable,但那不起作用。

+0

你可以顯示導致「QuestionSetAssignees.Contains(director)'調用的代碼嗎? –

+0

@ScottChamberlain更新 –

回答

1

問題是,它是在一個SQL調用把你Contains()所以無論你放什麼EqualsGetHashCode()都不會有問題,因爲要連接到數據庫不使用它們進行測試平等(這就是爲什麼當在整理不區分大小寫的數據庫上使用實體框架時,"This" == "this"將返回true)。

的「快速和骯髒」的方式來解決它是實現在內存中的集合,然後做.Contains

QuestionSetAssignees.AsEnumerable().Contains(director)) 

但是,這不會給你帶來非常不錯的表現。您可能需要以不同的方式來處理此查詢,以便SQL像您所希望的那樣工作。

我認爲以下方法可行,但請測試一下,如果沒有,我會將其刪除。

QuestionSetAssignees.Select(assignee => assignee.Id).Contains(director.Id) 
+0

QuestionSetAssignees對象沒有方法Select()。它也沒有AsEnumerable()。 –

+0

這是QuestionSetAsignees的屬性聲明: public virtual ICollection QuestionSetAssignees {get;組; } –

+1

一定要在文件的頂部包含'using System.Linq;',這就是爲什麼你不能'.Select('也不'''''''''' –

相關問題