2016-07-08 18 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; 
} 

アイデアは、それぞれの具体的なリポジトリが他のエンティティへの参照を更新するために、それは自身の取り扱いだ定義することができるようにすることです: 私はこのようになります一般的なリポジトリを作成しました。

すでに存在する市場で新しい展覧会を作成すると、関連付けられた市場が複製されるという問題が発生します。私の質問は、EFの代わりに複製を作成するのではなく、既存の市場を関連付けるために説得する方法である、だから、

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

:私のコンテキストは次のセットアップを使用していますか?

このような問題を回避するために、ナビゲーションプロパティと一緒にIDプロパティを使用することについて多くを読んだが、多対多の関係ではこれはオプションではないようだ。

答えて

0

私は正しい方向に向いてくれてありがとう。 StateAddedに設定されているときはすべてです。私はちょうど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

EntryからAddedStateを変更すると、エントリの状態とすべての関係の状態がAddedに変更されます。したがって、これらの関係を別々に追加する必要はありません。

CreateメソッドではUpdateReferences(data, dbEntity);という行をコメントしてください。すべてうまくいくはずです。

私は

dbEntity.State = EntityState.Added; 

後に置かラインに問題

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

はあなたのエンティティのコンストラクタでは、次の手順を試すことができます感知

+0

私の問題は、既存のMarketsが作成された展覧会に関連付けられていないということです。代わりにMarketsは重複として作成されます。 – Jensen

1

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); 
    } 
} 

それが機能しない場合は、プロキシが有効になっている可能性があります。