EF4 - Изменения, которые не фиксируются между сеансами

StackOverflow https://stackoverflow.com/questions/2135439

Вопрос

Я пытаюсь протестировать отделение объекта от одного контекста, внесение в него изменений, создание нового контекста, его присоединение и сохранение изменений, внесенных между сеансами.Кажется, я не могу заставить это работать должным образом.Я пытался вызвать 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top