2016-04-22 8 views
2

Ich versuche, ein Objekt in Entity Framework mit der Methode in this answer zu duplizieren, aber wenn ich Add(clone) aufrufen bekomme ich eine InvalidOperationException sagen, dass eine Beschränkung der Vielfalt verletzt wurde. Mein Code sieht wie folgt ausMultiplikationsbedingung verletzt beim Versuch, Entity Framework-Objekt zu klonen

var dbSet = context.Set<MyObject>() 
var clone = dbSet.Include(e => e.Property1) 
       .Include(e => e.Property2) 
       .Include(e => e.Property3) 
       .AsNoTracking() 
       .First(e => e.Id == OriginalPrimaryKey) 
dbSet.Add(clone); // Throws InvalidOperationException 
context.SaveChanges(); 

Der Stack-Trace sieht aus wie

System.InvalidOperationException von Code Benutzer unhandled war
HResult = -2146233079 Message = Multiplicity Einschränkung verletzt. Die Rolle 'MyObject_Property1_Target' der Beziehung 'DataModels.MyObject_Property1' hat Multiplizität 1 oder 0..1. Source = EntityFramework Stacktrace: bei System.Data.Entity.Core.Objects.EntityEntry.WillNotRefSteal (EntityReference refToPrincipal, IEntityWrapper wrappedPrincipal) bei System.Data.Entity.Core.Objects.EntityEntry.FixupEntityReferenceToPrincipal (EntityReference RelatedEnd, EntityKey foreignKey Boolean, setIsLoaded, Boolean replaceExistingRef) bei System.Data.Entity.Core.Objects.EntityEntry.FixupReferencesByForeignKeys (Boolean replaceAddedRefs, EntitySetBase restrictTo) bei

Beachten Sie, dass Property1 ist ein Full-Objekt mit einem Fremdschlüssel ba ck zu MyObject. Von dem, was ich sagen kann, kommt der Multiplikationsfehler von der Tatsache, dass die Property1 Objekte zwischen einer vorhandenen Entität und meinem Klon "gleich" sind gemäß EF (sie sind nicht gleich, ich habe überprüft).

Von den Looks der obigen Antwort, ich dachte, bei der Verwendung von AsNoTracking EF würde damit umgehen und eine neue Version der Property1 Einheit in der Datenbank speichern zu generieren. Ist das nicht der Fall? Wenn nicht, was ist der beste Weg, um meine gesamte Entity mit allen referenzierten Eigenschaften zu klonen?

Antwort

3

Ich reparierte dies durch den Primärschlüssel aller referenzierten Eigenschaften auf 0. So jetzt mein Code wie

sieht doesn
var dbSet = context.Set<MyObject>(); 
var clone = dbSet.Include(e => e.Property1) 
       .Include(e => e.Property2) 
       .Include(e => e.Property3) 
       .AsNoTracking() 
       .First(e => e.Id == OriginalPrimaryKey); 
clone.Property1.Id = 0; 
clone.Property2.Id = 0; 
clone.Property3.Id = 0; 
dbSet.Add(clone); 
context.SaveChanges(); 

Ich bin mir nicht sicher, ob dies der richtige Weg zu tun, ist dies-es sicherlich fühle mich nicht richtig - aber ich konnte nichts anderes finden, was funktioniert.

+0

Ich weiß nicht, ob es auch richtig ist, aber es hat mein Problem behoben, danke. –

Verwandte Themen