Frage

Ich versuche zu testen, wie man eine Entität aus einem Kontext löst, Änderungen daran vornimmt, einen neuen Kontext erstellt, ihn anhängt und die zwischen den Sitzungen vorgenommenen Änderungen beibehält.Ich schaffe es anscheinend nicht, das richtig zum Laufen zu bringen.Ich habe versucht, sowohl DetectChanges als auch ApplyCurrentValues ​​aufzurufen, ohne Erfolg.Unten ist, was ich bisher habe.Das sind keine POCOs und ich möchte sie auch nicht als solche behandeln.Ich möchte lediglich in der Lage sein, eine Entität zu trennen, Änderungen daran vorzunehmen und sie wieder anzuhängen.Danke!

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);
}
War es hilfreich?

Lösung

Wenn Sie ein Objekt an einen Kontext anhängen, geht der Kontext davon aus, dass das Objekt unverändert ist, sofern Sie ihm nichts anderes mitteilen.Der einfachste Weg, dies zu tun, besteht darin, das Objekt zunächst an den Kontext anzuhängen und es dann zu ändern.Sie könnten Ihren Code also wie folgt ändern:

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

Ein anderer Ansatz wäre Verwenden Sie Context.ObjectStateManager.ChangeObjectState.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top