簡體   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