EF4 - Изменения, которые не фиксируются между сеансами
-
22-09-2019 - |
Вопрос
Я пытаюсь протестировать отделение объекта от одного контекста, внесение в него изменений, создание нового контекста, его присоединение и сохранение изменений, внесенных между сеансами.Кажется, я не могу заставить это работать должным образом.Я пытался вызвать DetectChanges, а также ApplyCurrentValues без успеха.Ниже приведено то, что у меня есть на данный момент.Это не POCO, и я не хочу относиться к ним как к таковым.Я просто хочу иметь возможность отсоединить объект, внести в него изменения и повторно присоединить его.Спасибо!
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); }
Решение
Когда вы присоединяете объект к контексту, контекст будет предполагать, что объект не изменен, если вы не укажете ему иное.Самый простой способ сделать это - сначала присоединить объект к контексту, а затем изменить его.Таким образом, вы могли бы изменить свой код на:
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);
}
Другой подход заключался бы в том, чтобы используйте Context.ObjectStateManager.Измените ObjectState.