Domanda

Sto provando a testare il distacco di un'entità da un contesto, apportando modifiche ad essa, creando un nuovo contesto, allegandolo e mantenendo le modifiche apportate tra le sessioni.Non mi sembra di riuscire a farlo funzionare in modo appropriato.Ho provato a chiamare DetectChanges e ApplyCurrentValues ​​senza successo.Di seguito è riportato ciò che ho ottenuto finora.Questi non sono POCO e non voglio trattarli come tali.Voglio solo essere in grado di staccare un'entità, apportarvi modifiche e ricollegarla.Grazie!

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);
}
È stato utile?

Soluzione

Quando alleghi un oggetto a un contesto, il contesto presumerà che l'oggetto non sia stato modificato, a meno che tu non gli dica diversamente.Il modo più semplice per farlo è collegare prima l'oggetto al contesto, quindi modificarlo.Quindi potresti cambiare il tuo codice in:

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

Un altro approccio sarebbe quello utilizzare Context.ObjectStateManager.ChangeObjectState.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top