2017-04-13 9 views
1

contactMarketingContactタイプを追加して、データベースのテーブルにオブジェクトを追加しています。これらは私のモデルクラスです:Entity Frameworkを使用して他のオブジェクトのリストを含むテーブルにオブジェクトを追加

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()方法であって、私のコントローラのアクションIであること

[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オブジェクトには、TagIdの値を含めて、ContactTagsテーブルにフィールドが存在するContactTagsコレクションが含まれていますが、MarketingContacsテーブルのその行に関連付けるのではなく、 ContactTagsテーブルはTagId(新しい値を生成する)を除いて同じ値を持ちますので、値は毎回ContactTagsテーブルに複製されており、その必要はありません。私は何を変える必要がありますか?

答えて

2

問題は、あなたが

context.MarketingContacts.Add(marketingContact); 

を呼び出すときにEFがContactTags収集とマーク(に添付してロードされ、)現在によって追跡されていない各オブジェクトの新しいとしてコンテキストを反復することです。

あなたはそれらが既存のエンティティであることを知っているので、あなたはそれをEFに伝えなければなりません。これを行う1つの方法は、メインエンティティを追加する前に、それらを文脈に添付して(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); 
関連する問題