2017-09-10 24 views
0

我正在與擁有一對多關係的兩個公司和訪問者合作。MVC EF:通過ID添加一個到多個組件

public class Company 
{ 
    public int CompanyID { get; set; } 
    public string CompanyName { get; set; } 

    public virtual ICollection<Visitor> Visitors { get; set; } 
} 

public class Visitor 
{ 
    public int VisitorID { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public int CompanyID { get; set; } 
    public bool SendNewsletter { get; set; } 

    public virtual Company Company { get; set; } 
} 

我有一個頁面,訪問者可以填寫有關他們自己的信息。這個想法是,如果公司不在數據庫中,它將被添加到列表中。如果公司名稱訪客進入與數據庫中的名稱匹配,則公司與訪客相關聯,完成其所需的信息,然後將其添加到其自己的數據庫中。

var companyExists = db.Companies.Any(c => c.CompanyName == visitor.Company.CompanyName); 
if(companyExists) 
{ 
     var existingCompany = db.Companies.SingleOrDefault(c => c.CompanyName == visitor.Company.CompanyName); 
     visitor.CompanyID = existingCompany.CompanyID; 
     visitor.Company = existingCompany; 
} 

db.Visitors.Add(visitor); 
db.SaveChanges(); 

此代碼有效,但似乎是多餘的。我將訪客的公司ID與現有公司聯繫起來,然後爲公司做同樣的事情。我讀過的每件事都表明,更新Visitor的CompanyID應該足夠了,但如果我沒有將existingCompany映射到Visitor的公司參數,則會創建第二個CompanyID。我覺得我錯過了一些關鍵點,希望有人能夠指引我走向正確的方向。

回答

0

你不需要設置visitor.Company。您可以通過CompanyID得到Company的信息,您可以使用WhereFirstOrDefault避免重複這樣的:

var companyExists = db.Companies.Where(c => c.CompanyName == visitor.Company.CompanyName).FirstOrDefault(); 
if (companyExists) 
{ 
    visitor.CompanyID = companyExists.CompanyID; 
    // visitor.Company = companyExists; 
} 

注意public virtual Company Company { get; set; }允許實體框架來創建一個圍繞虛擬財產代理,因此該屬性可以支持延遲加載和更有效的變更追蹤。有關virtual房地產的更多信息,請參閱this post

+0

謝謝你的回覆阿里。我嘗試了你的建議,但程序仍然爲Visitor.Company.CompanyID創建了一個與Visitor.CompanyID不匹配的新ID。有沒有更簡單的方法來連接兩者?我認爲這是懶加載,所以我啓用它,並沒有改變。 –

+0

@Yusif_Nurizade您是否在代碼塊中添加「visitor」和「Company」? –

+0

阿里蘇丹尼你能說清楚你的意思嗎?什麼代碼塊?我有頂部的現有代碼。如果公司存在,我不會添加它,只需根據您的建議將該ID關聯起來,但仍會創建具有不同ID的新公司。 –