我有一個項目表,其中有三個關聯到聯繫人表,每種類型的聯繫人(贊助商,經紀人,物流)。我允許用戶從現有的聯繫人列表中進行選擇。如果爲兩個或多個這些代碼選擇了相同的聯繫人,請將它們正確地指向現有條目,但我會在數據庫中獲得一個新的未使用的聯繫人條目。附加重複的現有實體到一個新的實體
我只允許修改任何重複的第一個,我將它們組裝成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的撲救,但我得到一個新的雅各布馬利也保存在聯繫人表中沒有的項目指向那個條目。認真考慮在裝配過程中訪問上下文,所以我知道現有條目已經連接。