2017-04-13 35 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);