Ich versuche, eine Entität wie beschrieben here zu kopieren. In meiner Entity-Wrapper-Basisklasse habe ich den folgenden Code zum Kopieren/Klonen einer Entität.Cloning-Entität schlägt mit Primärschlüsselverletzung bei SaveChanges()
public TBaseEntityModel Clone(TPrimaryKey newPrimaryKey)
{
var newEntity = Activator.CreateInstance<TEntity>();
var clone = DbContext.Entry(newEntity);
clone.State = EntityState.Added;
DbContext.Entry(newEntity).CurrentValues.SetValues(TheEntity);
clone.State = EntityState.Detached;
var cloneEntityModel= (TBaseEntityModel)Activator.CreateInstance(typeof(TBaseEntityModel), DbContext, newEntity);
cloneEntityModel.PrimaryKeyValue = newPrimaryKey;
return cloneEntityModel;
}
Nachdem ich die Clone
-Methode auf meine konkrete Einheit nennen, hat es auch ist es neue Primary Key Set auf den angegebenen Wert von newPrimaryKey
.
Das Problem tritt auf, wenn ich SaveChanges()
auf den zugrunde liegenden Kontext aufrufen.
Es wirft dann:
Violation of PRIMARY KEY constraint '...'. Cannot insert duplicate key in object 'dbo....'. The duplicate key value is (553a7aa9-0ac2-40a0-820f-43a3b4af745f).
Aber wenn ich an meinem clone
aussehen wird der PK auf einen anderen Wert eingestellt. Also ich denke, es ist etwas in der ObjectContext
oder noch tiefer im Inneren.
Aber ich habe keine Ahnung, wie man den Fehler wegkommt.
Was passiert im Konstruktor von 'TBaseEntityModel'? –
Er setzt nur die Eigenschaften 'DbContext' und' TheEntity', die beide in der 'Clone'-Methode verwendet werden. Es setzt auch ein boolesches Flag, das den Status der Entität vor dem 'SaveChanges()' auf 'Added' setzt. Vielleicht gibt es das Problem? – KingKerosin
Sehr schwer zu sagen ohne all diese unsichtbaren beweglichen Teile. Jedenfalls würde ich einer Entität keinen Verweis auf einen Kontext geben. Eine Clone-Methode sollte einfach Folgendes tun: einen Klon erstellen. Es sollte nicht am Zustand des Klons beteiligt sein. –