EF4 – Änderungen werden zwischen Sitzungen nicht erfasst
-
22-09-2019 - |
Frage
Ich versuche zu testen, wie man eine Entität aus einem Kontext löst, Änderungen daran vornimmt, einen neuen Kontext erstellt, ihn anhängt und die zwischen den Sitzungen vorgenommenen Änderungen beibehält.Ich schaffe es anscheinend nicht, das richtig zum Laufen zu bringen.Ich habe versucht, sowohl DetectChanges als auch ApplyCurrentValues aufzurufen, ohne Erfolg.Unten ist, was ich bisher habe.Das sind keine POCOs und ich möchte sie auch nicht als solche behandeln.Ich möchte lediglich in der Lage sein, eine Entität zu trennen, Änderungen daran vorzunehmen und sie wieder anzuhängen.Danke!
OCConsumer consumer; using (var ctx1 = new CMSStagingContext()) { consumer = (from c in ctx1.OCConsumers select c).FirstOrDefault(); Console.WriteLine("Retrieved {0} - {1} {2}", consumer.CustomerId, consumer.FirstName, consumer.LastName); ctx1.Detach(consumer); } consumer.BirthDate = "10/22/1981"; using (var ctx2 = new CMSStagingContext()) { ctx2.Attach(consumer); ctx2.ApplyCurrentValues("OCConsumers", consumer); ctx2.SaveChanges(System.Data.Objects.SaveOptions.DetectChangesBeforeSave | System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave); }
Lösung
Wenn Sie ein Objekt an einen Kontext anhängen, geht der Kontext davon aus, dass das Objekt unverändert ist, sofern Sie ihm nichts anderes mitteilen.Der einfachste Weg, dies zu tun, besteht darin, das Objekt zunächst an den Kontext anzuhängen und es dann zu ändern.Sie könnten Ihren Code also wie folgt ändern:
OCConsumer consumer;
using (var ctx1 = new CMSStagingContext())
{
consumer = (from c in ctx1.OCConsumers
select c).FirstOrDefault();
Console.WriteLine("Retrieved {0} - {1} {2}",
consumer.CustomerId, consumer.FirstName, consumer.LastName);
ctx1.Detach(consumer);
}
using (var ctx2 = new CMSStagingContext())
{
ctx2.Attach(consumer);
consumer.BirthDate = "10/22/1981";
ctx2.SaveChanges(System.Data.Objects.SaveOptions.DetectChangesBeforeSave | System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);
}
Ein anderer Ansatz wäre Verwenden Sie Context.ObjectStateManager.ChangeObjectState.