EF4 - 会话之间未捕获的更改

时间:2010-01-25 20:36:27

标签: entity-framework visual-studio-2010-beta-2

我正在尝试测试从一个上下文中分离实体,对其进行修改,创建新上下文,附加它以及在会话之间进行更改。我似乎无法使其正常工作。我试过调用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 个答案:

答案 0 :(得分:1)

当您将对象附加到上下文时,上下文将假定该对象未被修改,除非您另有说明。最简单的方法是首先将对象附加到上下文,然后修改它。因此,您可以将代码更改为:

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);
}

另一种方法是use Context.ObjectStateManager.ChangeObjectState.