【问题标题】:EF4 - Changes not being captured between sessionsEF4 - 会话之间未捕获更改
【发布时间】:2010-01-26 05:46:10
【问题描述】:

我正在尝试测试从一个上下文中分离一个实体,对其进行修改,创建一个新上下文,附加它,并使会话之间所做的更改保持不变。我似乎无法正常工作。我试过调用 DetectChanges 和 ApplyCurrentValues 都没有成功。以下是我到目前为止所得到的。这些不是 POCO,我不想这样对待它们。我只想能够分离一个实体,对其进行更改,然后重新附加它。谢谢!

OCConsumer 消费者; 使用 (var ctx1 = new CMSStagingContext()) { 消费者 =(来自 ctx1.OCConsumers 中的 c 选择 c).FirstOrDefault(); Console.WriteLine("检索到 {0} - {1} {2}", 消费者.CustomerId,消费者.FirstName,消费者.LastName); ctx1.Detach(消费者); } 消费者.BirthDate = "1981 年 10 月 22 日"; 使用 (var ctx2 = new CMSStagingContext()) { ctx2.附加(消费者); ctx2.ApplyCurrentValues("OCConsumers", consumer); ctx2.SaveChanges(System.Data.Objects.SaveOptions.DetectChangesBeforeSave | System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave); }

【问题讨论】:

    标签: entity-framework visual-studio-2010


    【解决方案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.

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 2013-03-05
    • 2018-04-03
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多