2012-05-09 48 views
0

我在實體框架中與POCOS建立了ManyToMany關係。實體框架4.0 - 多對多關係在映射的左側插入記錄,不僅在關係表中

我有一個名爲Transaction的表,它有一個TransactionId列和其他一些列,這是我想插入的實體,一個名爲Reason的表是一個具有ReasonId和ReasonDescription列的目錄表,我也有一個名爲Transaction_Reason的表來保存關係,這個表有2個稱爲ReasonId和TransactionId的列,並在其各自的表中具有前綴關鍵字。

在爲EF我TRANSATION配置我在構造函數如下:

   base.HasKey(t => new { t.TransactionId }).HasMany(c => c.Reasons).WithMany(r => r.Transactions) 
      .Map(t => 
      { 
       t.MapRightKey("ReasonId"); 
       t.MapLeftKey("TransactionId"); 
       t.ToTable("Transaction_Reason"); 
      }); 

的關係做得正確,我得到插在我Transaction_ReasonTable紀錄,但每當我查原因表我也得到記錄在這裏創建時,這應該只是一個目錄表。

繼承人我插入代碼:

   if (reasons != null) 
       { 
        foreach (var item in reasons) 
        { 
         Reason reason = _reasonReopository.Find(item); 

         transaction.Reasons.Add(reason); 

        } 
       } 

       transaction = this._repository.Create(transaction); 
       this._repository.Commit(); 

我只希望有插在我的交易表這是我創造我的保存方法,並在關係保存在Transaction_Reason表中的記錄的記錄,不在我的原因目錄表中。

有沒有人有任何想法如何避免這種情況?

回答

0

原因:)是:您通過_reasonReopository.Find(item)獲取reason實例,該實例使用自己的上下文實例。通過this._repository.Create(transaction)transaction添加到另一個上下文中,但是此上下文不會「知道」transaction中的reason實例,並將它們作爲新項目好心插入。

您可以通過兩種方式解決這個問題:

  • 抓取reason情況下,在相同的上下文中transaction
  • 附上reason實例爲Reasons DbSet中的transaction

我寧願第一種選擇的背景,但因爲你似乎有每個實體選項2庫可能最適合你的情況。但是,我會考慮將每個「聚合」的存儲庫重構爲存儲庫,其中聚合是一些邏輯相關的實體。雖然,繪製聚合體之間的邊界可能是主觀的。