Ich habe ein Projekt, das Entity Framework ausgiebig verwendet. Und alles funktioniert gut.Entity Framework aktualisiert keine vorhandene verbundene Entität
Allerdings gibt es ein Update, das ich versuche zu machen und es wird nicht aktualisiert, noch wird ein Fehler ausgelöst.
Der grundlegende Prozess besteht darin, dass ich eine vorhandene Entität nehme, mit ihr arbeite, um einen neuen (und anderen Typ) Entity zu erstellen. Die neue Entität spart gut, aber die bestehende nicht.
Normalerweise, wenn ich dies festgestellt habe, bedeutet dies, dass die Entität nicht an den Kontext gebunden ist. Wie auch immer, es ist, und ich habe versucht, es wieder anzuhängen sowie "Hinzufügen", aber ich hatte kein Glück.
if (fileRowEntity != null)
{
this.Context.FileRowEntities.Attach(fileRowEntity);
fileRowEntity.FileRowStatusId = (int)FileRowStatus.Converted;
fileRowEntity.EdiDocument = ediDocument;
}
ediDocument.InsertedDate = DateTime.Now;
ediDocument.EdiDocumentGuid = Guid.NewGuid();
ediDocument.DocumentMetatdata = null;
this.Context.EdiDocuments.Add(ediDocument);
var count = this.Context.SaveChanges();
Die ediDocument
wird gespeichert, aber die fileRowEntity
nicht gespeichert.
Ich reiße mir die Haare aus, um das herauszufinden. Ich habe versucht, auf der fileRowEntity
eine zweite explizite zu speichern, aber es kommt wieder mit Null Änderungen gespeichert:
if (fileRowEntity != null)
{
fileRowEntity.EdiDocumentId = ediDocument.EdiDocumentId;
fileRowEntity.Column100 = "X";
this.Context.FileRowEntities.Attach(fileRowEntity);
count = this.Context.SaveChanges();
}
count
ist immer Null, und die Datenbank wird nicht aktualisiert.
Ich weiß nicht, was noch zu versuchen, dies zu debuggen.
Wenn Sie eine Entity anhängen, wird sie nicht als geändert markiert ... haben Sie versucht, 'Context.Entry (fileRowEntity) .State = EntityState.Modified;'? (Sie müssen es nicht anhängen, das wird die Entity anhängen, wenn es auch losgelöst ist). Wenn die Entität kein Proxy ist und/oder zuvor geladen wurde, weiß EF nicht, dass Änderungen daran vorgenommen wurden, es sei denn, Sie teilen dies mit, sodass keine Aktualisierungen vorgenommen werden. Es sollte explizit als "Modified" markiert werden. – Jcl
Danke. Ja, das macht die Speicherung tatsächlich möglich. Bedeutet dies, dass sich die Entität tatsächlich nicht im selben Kontext befand? Soweit ich das beurteilen kann, wird der gleiche Entity Manager verwendet, um die Entitäten als speichern sie abzurufen. –
Wenn eine Entität aus der Datenbank geladen wird, werden ihre ursprünglichen Werte (wie sie abgerufen wurden) im Kontext gespeichert (Sie können sie in "Context.Entry (entity) .OriginalValues" überprüfen), wenn dbcontext dies überprüft ändert (durch Aufrufen von 'DetectChanges'), speichert es die neuen Werte (Sie können sie in' Context.Entry (entity) .CurrentValues' überprüfen), und wenn eine davon geändert wird, wird beim Speichern der Änderungen ein 'UPDATE' generiert . Wenn also die ursprüngliche Entität durch denselben Kontext aus der Datenbank abgerufen wurde, dann sollte sie die Änderungen erkennen und die Änderungen speichern. – Jcl