2010-07-13 7 views
2

J'utilise framework d'entité avec Visual Studio 2008, sûr qu'il était SP1 à la fois .NET Framework et VS lui-même. Mon application est développée dans un environnement n-tier. Première étape Je convertis les données du contexte à la collection et sérialise à l'utilisateur.Entity Framework SaveChanges() ne fonctionne pas?

HRMSDBContext context = new HRMSDBContext(); 

List<InHouseTrainingHead> heads = context.InHouseTrainingHead.ToList<InHouseTrainingHead>(); 

foreach (InHouseTrainingHead head in heads) 
{ 
    context.Detach(head); 
} 

return heads; 

Après l'utilisateur modifie certaines données et cliquez sur Enregistrer puis ce retour de la liste à la méthode de sauvegarde.

HRMSDBContext context = new HRMSDBContext(); 

foreach (InHouseTrainingHead head in lists) 
{ 
    context.Attach(head); 
    context.ApplyPropertyChanges(head.EntityKey.EntitySetName, head); 
} 

context.SaveChanges(); 

Malheureusement, après l'enregistrement de SaveChanges(), rien ne se produit. Comment puis-je résoudre ce problème?

Merci

Répondre

2

Vous n'utilisez pas ObjectContext.ApplyPropertyChanges la façon dont il est destiné à être utilisé. Vous avez besoin de deux instances de l'entité - une instance non modifiée attachée au contexte et une autre modifiée. Les modifications sont ensuite appliquées à l'entité attachée non modifiée, elle est modifiée et vous pouvez enregistrer les modifications. Vous ne devez donc pas attacher l'entité modifiée mais charger l'entité à partir de la base de données avant d'appeler ObjectContext.ApplyPropertyChanges.

4

Pour étendre la réponse de Daniel Brückner - ce qui se passe dans votre échantillon est que vous essayez de ApplyPropertyChanges entre l'objet head et lui-même. Évidemment, il n'y a pas de changement, donc rien n'est sauvé. Si vous ne voulez pas extraire l'enregistrement de la base de données, vous pouvez toutefois définir le EntityState de l'entité nouvellement jointe sur Modified manuellement. Dans ce cas, il sera enregistré dans la base de données:

HRMSDBContext context = new HRMSDBContext(); 

foreach (InHouseTrainingHead head in lists) 
{ 
    context.Attach(head); 
    ObjectStateEntry addedEntity = context.ObjectStateManager.GetEntry(head); 
    addedEntity.ChangeState(EntityState.Modified); 
} 

context.SaveChanges(); 
Questions connexes