2009-07-14 8 views
1

J'ai posé cette question plus tôt mais je pense que je l'ai mal formulée, alors voici la tentative numéro deux. J'ai le code suivant:ApplyPropertyChanges and References

public User EditUser(User userToEdit) 
{ 
    //userToEdit contains values for eagerly loaded contacts entity 

    User originalUser = (from u in _entities.UserSet.Include("contacts") 
           where u.ID == userToEdit.ID 
           select u).FirstOrDefault(); 

    _entities.ApplyPropertyChanges(originalUser.EntityKey.EntitySetName, userToEdit); 
    _entities.SaveChanges(); 

    return userToEdit;    
} 

Assez direct. Cependant, l'entité contacts n'est pas mise à jour. Pour ma compréhension, le chargement hâtif ajoute l'entité au contexte de données, donc lorsque ApplyPropertyChanges est appelé avec le userToEdit détaché, les modifications apportées aux contacts dans userToEdit seront appliquées à l'entité contacts jointe. Qu'est-ce que je rate?

Répondre

1

Oui, c'est un effet secondaire malheureux de ce qu'on appelle « Independent Associations »

Dans l'EF (au moins dans 3.5 SP1) les relations ne sont pas considérés comme faisant partie de l'entité, à savoir il y a indépendant. Cela signifie que l'appel ApplyPropertyChanges(...) affecte uniquement les propriétés qui font partie structurellement de l'entité et non les références.

Alors vous avez besoin de changer votre code à ceci:

public User EditUser(User userToEdit){  
    //userToEdit contains values for eagerly loaded contacts entity  
    User originalUser = (from u in _entities.UserSet.Include("contacts")         
     where u.ID == userToEdit.ID         
     select u).FirstOrDefault(); 

    _entities.ApplyPropertyChanges(originalUser.EntityKey.EntitySetName, userToEdit); 
    originalUser.Contacts = userToEdit.Contacts; 
    _entities.SaveChanges();  
    return userToEdit;    
} 

Cela suppose que userToEdit.Contacts est référence (non une collection), et non nul.

Hope this helps Alex

PS Dans .NET 4.0 Beta2 quelque chose appelé FK associations va résoudre ce problème et faire en sorte votre code fonctionnerait.

+0

Merci beaucoup, on dirait que ça va faire l'affaire. J'attends avec impatience la version bêta 2 de la version 4.0, la plupart des problèmes que j'ai rencontrés avec EF semblent être résolus. –

+0

Merci. Vous avez mentionné que userToEdit.Contacts n'est pas une collection. Comment les modifications doivent-elles être effectuées si userToEdit.Contacts est une collection et non une référence. Dans mon cas, l'élément est de type EntityCollection. S'il vous plaît aider. –