2017-04-13 70 views
1

我加入一个对象在数据库中的表的其他对象的名单表,加入MarketingContactcontact。这是我的模型类:添加对象包含使用实体框架

public class MarketingContact 
    { 
     public MarketingContact() 
     { 
      this.ContactTags = new List<ContactTag>(); 
     } 

     public int id { get; set; } 
     //..some other properties not complex properties... 
     public virtual ICollection<ContactTag> ContactTags { get; set; } 
    } 

这是ContactTag型号:

public class ContactTag 
    { 
     public ContactTag() 
     { 
      this.MarketingContacts = new List<MarketingContact>(); 
     } 

     public int TagId { get; set; } 
     //some other no complex properties... 
     public virtual ICollection<MarketingContact> MarketingContacts { get; set; } 
    } 

这是我AddContact()方法在我的控制器:

[HttpPost] 
     public ActionResult AddContact(MarketingVM marketingContactVM) 
     {    
      List<ContactTag> contactTags = new List<ContactTag>(); 
      for (int i = 0; i < marketingContactVM.MarketingContacts.Count; i++) 
      { 
       if (marketingContactVM.MarketingContacts[i].IsSelected==true) 
       { 
        contactTags.Add(new ContactTag { Name = marketingContactVM.MarketingContacts[i].Name, TagId = marketingContactVM.MarketingContacts[i].TagId, 
        InfusionSoftId = marketingContactVM.MarketingContacts[i].InfusionSoftId}); 
       } 
      } 
      MarketingContact marketingContact = AutoMapper.Mapper.Map<MarketingContact>(marketingContactVM); 
      marketingContact.ContactTags = contactTags;     
      context.MarketingContacts.Add(marketingContact); 
      context.SaveChanges();   
      return Json(new { result = "success"}, JsonRequestBehavior.AllowGet); 
     }  

注意,在我的控制器操作我正在使用ViewModel(MarketingVM type)。 在我保存到MarketingContact对象保存在MarketingContacts表的数据库,但在ContactTags表中的新行创建取决于什么属于marketingContactContactTags ICollection包含的时间,我只是从ContactTags选择时,行已经存在,我不需要在ContactTags表中添加更多具有相同值的行,为什么会发生这种情况?此刻,我将对象保存到数据库中,marketingContact对象包含一个ContactTags集合,其中包含ContactTags表中存在的字段,包括正确的TagId值,但不是将它们与MarketingContacs表中的该行关联起来,而是在该表中创建新行ContactTags表除了TagId相同的值(它会产生一个新的值),因此该值被复制每次在ContactTags表,我不需要这个。我需要改变什么?

回答

2

的问题是,当你调用

context.MarketingContacts.Add(marketingContact); 

EF迭代的ContactTags收集和记录下的是当前没有被跟踪的每个对象(在装,安装到)上下文如新。

既然你知道自己在现有的实体,你必须告诉给EF。一种方法是在添加主实体之前将它们附加到上下文(将它们标记为Unchanged)。

举例来说,你可以改变

contactTags.Add(new ContactTag { Name = marketingContactVM.MarketingContacts[i].Name, TagId = marketingContactVM.MarketingContacts[i].TagId, 
InfusionSoftId = marketingContactVM.MarketingContacts[i].InfusionSoftId}); 

// Note: setting just TagId would be enough 
var contactTag = new ContactTag { Name = marketingContactVM.MarketingContacts[i].Name, TagId = marketingContactVM.MarketingContacts[i].TagId, 
InfusionSoftId = marketingContactVM.MarketingContacts[i].InfusionSoftId}; 
contactTags.Add(contactTag); 
// the next line will give you the desired behavior 
context.ContactTags.Attach(contactTag);