Force le code EF 4.1 à voir une entité attachée telle que modifiée

code-first entity-framework

Question

Tous les exemples que j'ai trouvés font référence à une classe appelée ObjectContext, qui n'existe apparemment pas dans CTP5. Je dois souligner à ce stade que CTP5 est ma première exposition à Entity Framework.

J'ai un POCO déconnecté que j'ai attaché à mon DbContext. SaveChanges ne prend pas le changement bien, comment puis-je dire à mon contexte de mettre à jour cette entité?

_context.Users.Attach(user);
// The user has been replaced.
_context.SaveChanges();
// The change is not saved.

Qu'est-ce que je fais mal?

Mise à jour du 12/01/2011 Cela peut sembler évident pour la plupart des utilisateurs, mais en tant que nouvel utilisateur d'EF, je ne me suis pas rendu compte que le fait d'associer un objet déjà associé effacerait l'état précédent. Cela m'a causé beaucoup de douleur. Mais je voulais utiliser le modèle de référentiel de manière très générique, ce qui importait peu que l'objet soit déjà attaché ou s'il venait d'être créé à la suite d'une liaison ASP.NET MVC. J'ai donc eu besoin d'une méthode UpdateUser , et je l'ai jointe ci-dessous.

    public User UpdateUser(User user) {
        if (_context.Entry(user).State == EntityState.Detached) {
            _context.Users.Attach(user);
            _context.Entry(user).State = EntityState.Modified;
        }
        return user;
    }

La méthode suppose évidemment que l’objet existe d’une manière ou d’une autre dans le magasin de données, il s’appelle tout de même UpdateUser . Si l'objet est déjà attaché, vous bénéficierez de l'état précédent de l'objet, ce qui permettra une mise à jour optimisée de la base de données. Cependant, si l'objet n'était pas attaché, la méthode force tout à devenir sale.

Cela semble évident maintenant, ce n'était pas le cas auparavant. J'espère que ça aide quelqu'un.

Riches

Réponse acceptée

Lorsque vous attachez une entité, elle passe à l'état Inchangé (il n'a pas été modifié depuis l'attachement au contexte) Tout ce dont vous avez besoin est de changer explicitement l’Etat de l’entité en Modifié :

_context.Users.Attach(user);
_context.Entry(user).State = System.Data.Entity.EntityState.Modified;
_context.SaveChanges();

Réponse populaire

Par souci d'exhaustivité, vous pouvez accéder à ObjectContext en convertissant DbContext en IObjectContextAdapter:

((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.ChangeObjectState(user, EntityState.Modified);

La méthode de Morteza est cependant beaucoup plus propre et obtient mon vote.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow