[英]Best way to update an object containing a list of objects in Entity Framework
[英]Add object to table containing List of other objects using Entity Framework
我正在向數據庫中的表添加對象,添加了MarketingContact
類型的contact
。 這些是我的模型類:
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
表中,根據屬於marketingContact
的ContactTags ICollection
包含的內容創建新行,而我只是從ContactTags
選擇行已經在那里,我不需要在ContactTags
表中添加具有相同值的更多行,為什么會發生這種情況? 目前,我將對象保存到數據庫中時, marketingContact
對象包含一個ContactTags
集合,其中具有ContactTags
表中現有的字段,包括正確的TagId
值,但它不只是將它們與MarketingContacs
表中的該行相關,而是在除了TagId
之外, ContactTags
表具有相同的值(它會生成一個新值),因此,每次在ContactTags
表中都重復這些值,而我則不需要。 我需要改變什么?
問題是當您打電話時
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.