885 votes

Entity Framework 5 mise à Jour d'un Enregistrement

J'ai été d'explorer les différentes méthodes de montage/la mise à jour d'un enregistrement dans Entity Framework 5 dans un ASP.NET MVC3 de l'environnement, mais jusqu'à présent, aucun d'entre eux cochez toutes les cases dont j'ai besoin. Je vais vous expliquer pourquoi.

J'ai trouvé trois méthodes que je vais vous parler des avantages et des inconvénients:

Méthode 1 - Charger l'enregistrement, mise à jour chaque propriété

var original = db.Users.Find(updatedUser.UserId);

if (original != null)
{
    original.BusinessEntityId = updatedUser.BusinessEntityId;
    original.Email = updatedUser.Email;
    original.EmployeeId = updatedUser.EmployeeId;
    original.Forename = updatedUser.Forename;
    original.Surname = updatedUser.Surname;
    original.Telephone = updatedUser.Telephone;
    original.Title = updatedUser.Title;
    original.Fax = updatedUser.Fax;
    original.ASPNetUserId = updatedUser.ASPNetUserId;
    db.SaveChanges();
}    

Pros

  • Pouvez spécifier les propriétés de changement
  • Points de vue n'ont pas besoin de contenir tous les biens

Cons

  • 2 x requêtes sur la base de données à charger puis la mise à jour

Méthode 2 - Charge du dossier original, définissez les valeurs modifiées

var original = db.Users.Find(updatedUser.UserId);

if (original != null)
{
    db.Entry(original).CurrentValues.SetValues(updatedUser);
    db.SaveChanges();
}

Pros

  • Seulement les propriétés modifiées sont envoyées à la base de données

Cons

  • Points de vue doivent contenir tous les biens
  • 2 x requêtes sur la base de données à charger puis la mise à jour

Méthode 3 - Attachez l'enregistrement mis à jour et l'ensemble de l'état de EntityState.Modifié

db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();

Pros

  • 1 x requête sur la base de données à mise à jour

Cons

  • Ne pouvez pas spécifier les propriétés de changement
  • Points de vue doivent contenir tous les biens

Question

Ma question pour vous les gars; est-il un moyen propre que je peux réaliser cette série d'objectifs?

  • Pouvez spécifier les propriétés de changement
  • Points de vue n'ont pas besoin de contenir tous les biens (comme le mot de passe!)
  • 1 x requête sur la base de données à mise à jour

Je comprends que c'est tout à fait mineur chose à relever, mais j'ai peut-être manquant une solution simple à ce. Si pas de méthode on va l'emporter ;-)

684voto

Ladislav Mrnka Points 218632

Vous êtes à la recherche pour:

db.Users.Attach(updatedUser);
var entry = db.Entry(updatedUser);
entry.Property(e => e.Email).IsModified = true;
// other changed properties
db.SaveChanges();

176voto

smd Points 623

J'aime vraiment la accepté de répondre. Je crois qu'il est encore une autre façon d'aborder cette question. Disons que vous avez une très courte liste de propriétés que vous ne voulez pas jamais inclure dans une Vue, de sorte que lorsque la mise à jour de l'entité, ceux qui seraient omis. Disons que ces deux champs sont Mot de passe et numéro de sécurité sociale.

db.Users.Attach(updatedUser);

var entry = db.Entry(updatedUser);
entry.State = EntityState.Modified;

entry.Property(e => e.Password).IsModified = false;
entry.Property(e => e.SSN).IsModified = false;   

db.SaveChanges();   

Cet exemple permet essentiellement à laisser vos affaires de la logique seulement après l'ajout d'un nouveau champ à votre table des Utilisateurs et à votre Vue.

28voto

foreach (PropertyInfo propertyInfo in original.GetType().GetProperties())
{
        if (propertyInfo.GetValue(updatedUser, null) == null)
              propertyInfo.SetValue(updatedUser, propertyInfo.GetValue(original, null), null);
}

db.Entry(original).CurrentValues.SetValues(updatedUser);
db.SaveChanges();

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