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?
Ich weiß nicht, ob es auch richtig ist, aber es hat mein Problem behoben, danke. –