![](/img/trans.png)
[英]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.