2014-06-13 56 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。

如果您有任何问题,请发表评论。我定期检查,并会回复给你。

相关问题