239 votes

Comment mettre à ne jour qu’un seul champ à l’aide d’Entity Framework ?

Voici le tableau

Utilisateurs

et le code...

438voto

Stuart Points 1428

Réponse de Ladislav mis à jour pour utiliser DbContext (introduit en EF 4.1) :

54voto

Ladislav Mrnka Points 218632

Vous pouvez dire EF dont les propriétés ont besoin d’être mise à jour de cette façon :

23voto

marc_s Points 321990

Vous avez essentiellement deux options:

  • aller de l'EF chemin tout le chemin, dans ce cas, vous
    • chargement de l'objet en fonction du userId fournis - l'ensemble de l'objet est chargé
    • mise à jour de l' password champ
    • enregistrer l'objet en arrière en utilisant le contexte de l' .SaveChanges() méthode

Dans ce cas, c'est à EF comment gérer cela dans le détail. Je viens de tester cela, et dans le cas où je ne changer qu'un seul champ d'un objet, ce que EF crée est à peu près ce que vous souhaitez créer manuellement, trop quelque chose comme:

`UPDATE dbo.Users SET Password = @Password WHERE UserId = @UserId`

Si EF est assez intelligent pour comprendre ce que les colonnes ont en effet changé, et il va créer une instruction T-SQL pour gérer simplement les mises à jour qui sont en fait nécessaires.

  • vous définissez une procédure stockée qui fait exactement ce dont vous avez besoin, dans le code T-SQL (juste la mise à jour de l' Password colonne pour l' UserId et rien d'autre - exécute essentiellement UPDATE dbo.Users SET Password = @Password WHERE UserId = @UserId) et de vous créer une fonction d'importation de cette procédure stockée dans votre modèle EF et vous appelez cette fonction au lieu de faire les étapes décrites ci-dessus

14voto

groggyjava Points 133

J’utilise ceci :

entité :

DbContext :

code de l’accesseur :

7voto

GONeale Points 9432

Je suis en retard pour le jeu ici, mais c'est la façon dont je le fais, j'ai passé un certain temps à la chasse pour une solution que j'ai été satisfaits; cela produit un UPDATE UNIQUEMENT pour les champs qui ont été modifiés, comme vous le définir explicitement ce qu'ils sont par le biais d'une "liste blanche", un concept qui est plus sûr pour éviter formulaire web d'injection de toute façon.

Un extrait de mon ISession référentiel de données:

public bool Update<T>(T item, params string[] changedPropertyNames) where T 
  : class, new()
{
    _context.Set<T>().Attach(item);
    foreach (var propertyName in changedPropertyNames)
    {
        // If we can't find the property, this line wil throw an exception, 
        //which is good as we want to know about it
        _context.Entry(item).Property(propertyName).IsModified = true;
    }
    return true;
}

Ce pourrait être enveloppé dans un try..catch si vous le souhaite, mais personnellement, j'aime mon interlocuteur pour connaître les exceptions dans ce scénario.

Il serait appelé à quelque chose comme ce mode (pour moi, ce fut par l'intermédiaire d'un ASP.NET l'API Web):

if (!session.Update(franchiseViewModel.Franchise, new[]
    {
      "Name",
      "StartDate"
  }))
  throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X