繁体   English   中英

使用实体框架将对象添加到包含其他对象列表的表中

[英]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表中,根据属于marketingContactContactTags 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM