2016-07-08 88 views
0

我的數據在ExhibitionsMarkets之間有多對多關係。 在創建新展覽時,應該爲其分配一些現有市場。 我創建了一個通用的寶庫,它看起來是這樣的:EF6多對多關係添加重複條目

public virtual TDto Create(TDto data) 
{ 
     TEntity entity = ToEntity(data); 
     DbEntityEntry<TEntity> dbEntity = Context.Entry<TEntity>(entity); 
     dbEntity.State = EntityState.Added; 
     UpdateReferences(data, dbEntity); 
     Context.SaveChanges(); 
     data = ToModel(dbEntity.Entity); 
     return data; 
} 

的想法是讓每一個具體的存儲庫來定義它自己的操作,用於更新它的引用到其他實體。

protected override void UpdateReferences(Exhibition model, DbEntityEntry<Model.EventManagement.Exhibition> entity) 
{ 
    entity.Entity.Markets = new List<Model.EventManagement.Market>(); 
    foreach (var market in model.Markets) 
    { 
     var marketEntity = Context.Markets.Single(m => m.Id == market.Id); 
     entity.Entity.Markets.Add(marketEntity); 
    } 
} 

發生的問題是,當我創建一個已經存在的市場的新展會時,相關市場是重複的。我的上下文使用以下設置:

Configuration.LazyLoadingEnabled = false; 
Configuration.ProxyCreationEnabled = false; 

所以,我的問題是如何說服EF現有市場相關聯的,而不是創建副本,?

我讀了很多關於在導航屬性旁邊使用ID屬性以避免這種問題的方法,但是通過多對多關係,這似乎不是一種選擇。

回答

0

感謝您指點我正確的方向。 這是關於何時State設置爲Added。我只需要交換UpdateReferencesState = Added

public virtual TDto Create(TDto data) 
{ 
    TEntity entity = ToEntity(data); 
    DbEntityEntry<TEntity> dbEntity = Context.Entry<TEntity>(entity); 
    // call UpdateReferences first... 
    UpdateReferences(data, dbEntity); 
    // ...then set the State to Added 
    dbEntity.State = EntityState.Added; 
    Context.SaveChanges(); 
    data = ToModel(dbEntity.Entity); 
    return data; 
} 

雖然現在的工作如預期,這是非常令人困惑,因爲我想設置狀態後也將設置兒童各國增加,但顯然不是...¯\ _(ツ)_ /¯

1

當您更改EntryAddedState,記錄的狀態和它的所有關係的國家將變更爲Added。所以不需要分開添加這些關係。

因此,在您的Create方法中註釋行UpdateReferences(data, dbEntity);,一切都應該工作得很好。

+0

我的問題是,現有市場與創建的展覽沒有關聯,而是市場創建爲重複。 – Jensen

1

我感覺到一些問題放在

dbEntity.State = EntityState.Added; 

你可以嘗試以下之後的行

entity.Entity.Markets = new List<Model.EventManagement.Market>(); 

,在實體的構造函數:

public Exhibition() { 
    Markets = new List<Model.EventManagement.Market>(); 
} 

則:

protected override void UpdateReferences(
     Exhibition model, 
     Model.EventManagement.Exhibition entity) 
{ 
    foreach (var market in model.Markets) 
    { 
     var marketEntity = Context.Markets.Single(m => m.Id == market.Id); 
     entity.Markets.Add(marketEntity); 
    } 
} 

如果它不起作用,可能是啓用代理是關鍵。