2016-07-08 37 views
0

Meine Daten haben eine Viele-zu-Viele-Beziehung zwischen Exhibitions und Markets. Beim Erstellen einer neuen Ausstellung sollten einige bestehende Märkte zugewiesen werden. habe ich eine generische Repository, das wie folgt aussieht:EF6 Viele-zu-viele-Beziehung Doppelte Einträge auf Hinzufügen

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

Die Idee ist, jede konkrete Repository zu ermöglichen, seine eigene Behandlung zu definieren, für seine Verweise auf andere Entitäten zu aktualisieren.

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

Das Problem, das occures ist, dass die damit verbundenen Märkte dupliziert werden, wenn ich eine neue Ausstellung mit Märkten schaffen, die bereits existieren. Mein Kontext verwendet die folgende Konfiguration:

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

Also, meine Frage ist, wie EF davon zu überzeugen, die bestehenden Märkte zu verbinden, anstatt Duplikate zu schaffen?

Ich lese viel über die Verwendung von ID-Eigenschaften neben Navigationseigenschaften, um diese Art von Problemen zu vermeiden, aber mit vielen zu vielen Beziehungen scheint dies keine Option zu sein.

Antwort

0

Danke, dass Sie mich in die richtige Richtung weisen. Es geht darum, wenn State auf Added eingestellt ist. Ich brauchte nur zu tauschen UpdateReferences und State = 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; 
} 

Obwohl es jetzt wie erwartet funktioniert, ist es sehr verwirrend, da ich der Staat danach dachte Einstellung auch das Kind Staaten hinzugefügt setzen würde, aber anscheinend nicht ... ¯ \ _ (ツ) _/¯

1

Wenn Sie State eines Entry zu Added ändern, der staatlichen Eintrag und alle sein Staat Beziehung wird auf Added geändert werden. Daher müssen diese Beziehungen nicht getrennt hinzugefügt werden.

Also kommentieren Sie die Zeile UpdateReferences(data, dbEntity); in Ihrer Create Methode und alles sollte gut funktionieren.

+0

Mein Problem ist, dass die bestehenden Märkte nicht mit der erstellten Ausstellung verbunden sind, sondern die Märkte als Duplikate erstellt werden. – Jensen

1

Ich spüre ein Problem mit der Linie

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

platziert, nachdem

dbEntity.State = EntityState.Added; 

können Sie die folgende versuchen, in den Konstruktor Ihres Unternehmens:

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

dann:

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

Wenn es nicht so funktioniert wie es ist, kann die Aktivierung von Proxy der Schlüssel sein.