2010-01-25 17 views
1

J'essaie de tester le détachement d'une entité d'un contexte, en y apportant des modifications, en créant un nouveau contexte, en l'attachant et en conservant les modifications effectuées entre les sessions. Je ne semble pas être en mesure de le faire fonctionner correctement. J'ai essayé d'appeler DetectChanges et ApplyCurrentValues ​​sans succès. Voici ce que j'ai jusqu'ici. Ce ne sont pas des POCO et je ne veux pas les traiter comme tels. Je veux juste pouvoir détacher une entité, y apporter des modifications et la rattacher. Merci!EF4 - Les modifications ne sont pas capturées entre les sessions

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

Répondre

1

Lorsque vous attachez un objet à un contexte, le contexte va supposer que l'objet est non modifiée, à moins que vous arrêtiez. Le moyen le plus simple de le faire est d'attacher d'abord l'objet au contexte, puis de le modifier. Ainsi, vous pouvez changer votre code:

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

Une autre approche serait de use Context.ObjectStateManager.ChangeObjectState.

+0

J'avais l'impression que DetectChanges dans EF4 était censé faire exactement cela? –

+0

Il détecte les changements * vs. l'ancienne version de l'objet dans le contexte. * Qui, dans votre cas, est une seule et même chose. Voir: http://msdn.microsoft.com/en-us/library/dd456854(VS.100).aspx –