EF4: le modifiche non vengono acquisite tra le sessioni
-
22-09-2019 - |
Domanda
Sto provando a testare il distacco di un'entità da un contesto, apportando modifiche ad essa, creando un nuovo contesto, allegandolo e mantenendo le modifiche apportate tra le sessioni.Non mi sembra di riuscire a farlo funzionare in modo appropriato.Ho provato a chiamare DetectChanges e ApplyCurrentValues senza successo.Di seguito è riportato ciò che ho ottenuto finora.Questi non sono POCO e non voglio trattarli come tali.Voglio solo essere in grado di staccare un'entità, apportarvi modifiche e ricollegarla.Grazie!
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); }
Soluzione
Quando alleghi un oggetto a un contesto, il contesto presumerà che l'oggetto non sia stato modificato, a meno che tu non gli dica diversamente.Il modo più semplice per farlo è collegare prima l'oggetto al contesto, quindi modificarlo.Quindi potresti cambiare il tuo codice in:
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);
}
Un altro approccio sarebbe quello utilizzare Context.ObjectStateManager.ChangeObjectState.