我有一个项目表,其中有三个关联到联系人表,每种类型的联系人(赞助商,经纪人,物流)。我允许用户从现有的联系人列表中进行选择。如果为两个或多个这些代码选择了相同的联系人,请将它们正确地指向现有条目,但我会在数据库中获得一个新的未使用的联系人条目。附加重复的现有实体到一个新的实体
我只允许修改任何重复的第一个,我将它们组装成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的扑救,但我得到一个新的雅各布马利也保存在联系人表中没有的项目指向那个条目。认真考虑在装配过程中访问上下文,所以我知道现有条目已经连接。