2011-01-28 1 views
8

Comment effectuer une opération de mise à jour avec CTP 5 en utilisant DbContext et en utilisant le modèle Repository? Plus tôt avec EF 4.0, cela pourrait être fait comme ci-dessous.Entity Framework CTP 5 - Modèle de référentiel - faire des mises à jour

_context.Customers.AddObject(item); 
_context.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified); 

Y at-il une raison pour laquelle EF ne fournit pas un moyen facile de mettre à jour les entités "déconnectées". Je ne veux pas interroger la base de données et copier toutes les propriétés sur l'objet renvoyé par la requête. En d'autres termes, EF doit avoir une méthode de mise à jour qui prend en compte l'entité (similaire à la méthode Add). Si la clé d'entité existe déjà dans la base de données, mettez à jour l'entité avec les valeurs actuelles. c'est-à-dire pourquoi devrions-nous faire "Attach", puis copiez toutes les propriétés à l'objet attaché. Pour moi, il semble redondant de copier toutes les propriétés des entités juste pour mettre à jour quand l'objet "déconnecté" existe déjà.

Répondre

8

Je crois que vous pouvez toujours effectuer la même méthode que dans votre exemple de code pour mettre à jour une entité déconnectée avec le CTP5 DbContext:

_dbContext.Customers.Add(item); 
DbEntityEntry entry = _dbContext.Entry(item); 
entry.State = EntityState.Modified; 

_dbContext.SaveChanges(); 

En regardant la présente SQL généré crée bien sûr une déclaration de mise à jour complète sur tous les propriétés de l'objet client, y compris les propriétés qui n'ont pas réellement changé, car EF ne sait pas quel est l'état actuel dans la base de données. Si vous voulez éviter cela, je suppose qu'il n'y a pas d'autre moyen que la récupération de l'état actuel dans la base de données avant la mise à jour qui pourrait être fait de cette façon:

DbEntityEntry entry = _dbContext.Entry(_dbContext.Customers.Find(item.ID)); 
entry.CurrentValues.SetValues(entity); 

_dbContext.SaveChanges(); 

(En supposant ici, vous avez une ID clé sur votre client object "item".)

Ceci crée une instruction de mise à jour SQL qui inclut uniquement les propriétés qui ont effectivement changé par rapport à l'état dans la base de données. Je ne suis pas sûr que la seconde voie soit nécessairement l'option la moins performante en raison de l'instruction select supplémentaire. Si le type d'objet est grand mais que très peu de propriétés ont changé, l'envoi d'une instruction de mise à jour complète sur tous les champs peut être supérieur à une instruction select plus une mise à jour "petite" avec uniquement les champs réellement requis pour la mise à jour. (Mais ce n'est que spéculation, je ne suis pas un spécialiste SQL Server.)

+0

C'est exactement ce que je cherchais. Merci. J'ai une autre question à cet égard qui est demandé dans le commentaire à http://stackoverflow.com/questions/4167033/entity-framework-poco-with-foreign-keys. Laissez-moi savoir ce que vous pensez. "Comment faire cela en utilisant DbContext dans EF CTP 5 et avec" Ado.net DbContext generator "? Il n'y a pas de code de correction, donc paramétrer DirectorId ne supprime pas Director.Pas toujours définir movie.Director = null après avoir défini DirectorId my seule option? " – Jonna

+0

Désolé, je ne sais vraiment pas, je n'ai pas encore utilisé le générateur DbContext. – Slauma

+0

BTW: Si vous n'obtenez pas de réponses satisfaisantes ici à propos de CTP5, le forum pré-version EF pourrait être un autre bon endroit à demander: http://social.msdn.microsoft.com/Forums/en-US/adonetefx/threads – Slauma

Questions connexes