2011-07-22 114 views
0

我有兩個實體框架代碼優先POCO。我可以很容易地將新的網站和技術項目插入到數據庫中,但我似乎無法將站點與技術關聯。當我這樣做...EF代碼優先:連接表爲空

if(!site.Technologies.Any(o => (o.Name == technology.Name && technology.Source == source))) 
{ 
    site.Technologies.Add(technology); 
    technology.Sites.Add(site); 
} 

我得到一個重複鍵錯誤。如果我從條件中刪除第二行,則連接表TechnologiesSites不會獲得任何記錄!如何在EF Code First中插入?

public class Site 
{ 
    public Site() 
    { 
     Technologies = new HashSet<Technology>(); 
    } 

    [Key] 
    public string Hostname { get; set; } 
    public virtual ICollection<Technology> Technologies { get; set; } 
} 

public class Technology 
{ 
    [Key, Column(Order = 0)] 
    public string Name { get; set; } 
    [Key, Column(Order = 1)] 
    public string Source { get; set; } 
    public virtual ICollection<Site> Sites { get; set; } 

    public Technology() 
    { 
     Sites = new HashSet<Site>(); 
    } 
} 
+0

你能告訴我們你的病情生成的查詢? (提示,將條件存儲在一個變量中,並讓Visual Studio調試幫助您:var query = site.Technologies.Where(.......)) – Polity

+0

顯示或描述您是如何獲取網站和技術的。它們是否從相同的上下文實例加載? –

回答

0

你必須檢查兩個方向:

if(!site.Technologies.Any(o => (o.Name == technology.Name && technology.Source == source)) && 
!technology.Sites.Any(x => x.Hostname == site.Hostname) 
) 
{ 
    site.Technologies.Add(technology); 
    technology.Sites.Add(site); 
}