EF4 - Alterações não sendo capturados entre as sessões
-
22-09-2019 - |
Pergunta
Eu estou tentando testar a desanexação de uma entidade a partir de um contexto, fazer modificações, criando um novo contexto, anexando, e tendo as alterações feitas entre as sessões de persistir.Eu não parecem ser capazes de fazer este trabalho de forma adequada.Eu tentei chamar DetectChanges bem como ApplyCurrentValues w/ sem sucesso.Abaixo está o que eu tenho até agora.Estes não são POCO e eu não quero tratá-los como tal.Eu só quero ser capaz de separar uma entidade, fazer alterações, e reatá-lo.Obrigado!
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); }
Solução
Quando você anexa um objeto para um contexto, o contexto é que vai acreditar que o objeto é inalterado, a menos que você diga o contrário.A maneira mais simples para fazer isso é para anexar o objeto ao contexto primeiro, em seguida, modificá-lo.Assim, você poderá alterar o código para:
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);
}
Outra abordagem seria Contexto de uso.ObjectStateManager.ChangeObjectState.