EF4 - Изменения не фиксируются между сессиями - PullRequest
1 голос
/ 25 января 2010

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

1 Ответ

1 голос
/ 26 января 2010

Когда вы присоединяете объект к контексту, контекст предполагает, что объект не изменен, если вы не укажете ему иначе. Самый простой способ сделать это - сначала присоединить объект к контексту, а затем изменить его. Таким образом, вы можете изменить свой код на:

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.ChangeObjectState.

...