2014-06-13 50 views
0

我有一個項目表,其中有三個關聯到聯繫人表,每種類型的聯繫人(贊助商,經紀人,物流)。我允許用戶從現有的聯繫人列表中進行選擇。如果爲兩個或多個這些代碼選擇了相同的聯繫人,請將它們正確地指向現有條目,但我會在數據庫中獲得一個新的未使用的聯繫人條目。附加重複的現有實體到一個新的實體

我只允許修改任何重複的第一個,我將它們組裝成detached,然後在保存之前附加到DbContext。

if (newProject.SponsorContact != null && newProject.SponsorContact.Id > 0) 
    if (AttachContact(newProject.SponsorContact)) 
    SdContext.Entry(newProject.SponsorContact).State = EntityState.Modified; 
    else 
    newProject.SponsorContact = _contactDataMapper.GetContactById(newProject.SponsorContact.Id); 


if (newProject.BrokerContact != null && newProject.BrokerContact.Id > 0) 
    if (AttachContact(newProject.BrokerContact)) 
    SdContext.Entry(newProject.BrokerContact).State = EntityState.Modified; 
    else 
    newProject.BrokerContact = _contactDataMapper.GetContactById(newProject.BrokerContact.Id); 

if (newProject.LogisticsContact != null && newProject.LogisticsContact.Id > 0) 
    if (AttachContact(newProject.LogisticsContact)) 
    SdContext.Entry(newProject.LogisticsContact).State = EntityState.Modified; 
    else 
    newProject.LogisticsContact = _contactDataMapper.GetContactById(newProject.LogisticsContact.Id); 

AttachContact只跟蹤所連接的接觸式ID的,並且如果已經連接,這樣我可以抓住從上下文中現有的聯繫人返回false。

protected bool AttachContact(Contact contact) 
{ 
    if (!_attachedContacts.Contains(contact.Id)) 
    { 
    _attachedContacts.Add(contact.Id); 
    return true; 
    } 
    return false; 
} 

所以,如果我選擇雅各馬利用的ContactID 17兩次,我的項目有兩個條目指向正確修改雅各布·馬利編號17的撲救,但我得到一個新的雅各布馬利也保存在聯繫人表中沒有的項目指向那個條目。認真考慮在裝配過程中訪問上下文,所以我知道現有條目已經連接。

回答

0

我是新來的C#MVC和實體框架。這可能是常識,但如果您正在閱讀本文,您可能遇到了上述相同的問題。

關鍵要素是所涉及的模型具有多個引用相同外部表的字段,並且在裝配過程中這些是分離模型。在我的情況下,我有一個項目表,其中有三種不同類型的聯繫人,用戶可以選擇現有的聯繫人,這可能意味着所有三個字段都使用相同的外部聯繫人。

因此,項目模型有一個int外鍵字段爲每個和虛擬模型。

public Nullable<int> SponsorContactId { get; set; } 
public Nullable<int> BrokerContactId { get; set; } 
public Nullable<int> LogisticsContactId { get; set; } 
public virtual Contact SponsorContact { get; set; } 
public virtual Contact BrokerContact { get; set; } 
public virtual Contact LogisticsContact { get; set; } 

因爲我建我的彙編,從組織向下繼承到的項目聯繫我無法組裝聯繫人作爲附件。

有兩種方法可以解決這個問題。

首先是確保您將它們組裝爲附件,這意味着您從上下文中獲取聯繫人模型,而不是創建新的聯繫人模型。

第二個是我拿的路線。我只允許用戶在前端編輯同一聯繫人,並在我修改過的視圖模型中進行跟蹤。在裝配過程中,如果聯繫人存在,這意味着它具有Id> 0,我只會組裝虛擬聯繫人,如果它也被修改。如果沒有修改,我只填充int值。因此,如果贊助商聯繫人存在但未經過修改,我設置了int SponsorContactId並且未組裝Contact SponsorContact。

如果您有任何問題,請發表評論。我定期檢查,並會回覆給你。

相關問題