我正在向数据库中的表添加一个对象,添加contact
MarketingContact
类型。这些是我的模型类:
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
表中,新行是根据ContactTags ICollection
创建的属于marketingContact
包含,我只是从ContactTags
中选择,行已经存在,我不需要在ContactTags
表中添加相同值的更多行,为什么这样发生了什么?目前,我将对象保存到数据库中,marketingContact
对象包含ContactTags
集合,其中包含ContactTags
表中存在的字段,包括正确的TagId
值,而不是只需将它们与MarketingContacs
表中的那一行相关联,它就会在ContactTags
表中创建具有相同值的新行,但TagId
除外(它会生成一个新值)因此值是重复的每次都在ContactTags
表中,我不需要那样。我需要改变什么?
答案 0 :(得分: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);