使用Entity Framework将对象添加到包含其他对象的List的表

时间:2017-04-13 17:59:29

标签: c# asp.net-mvc entity-framework

我正在向数据库中的表添加一个对象,添加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表中,我不需要那样。我需要改变什么?

1 个答案:

答案 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);