web-dev-qa-db-fra.com

Enregistrer l'entité détachée dans Entity Framework 6

J'ai lu BEAUCOUP de publications sur la sauvegarde d'une entité détachée dans Entity Framework. Tous semblent s’appliquer aux anciennes versions d’Entity Framework. Ils font référence à des méthodes telles que ApplyCurrentValues ​​et ChangeObjectState qui ne semblent pas exister. Sur un coup de tête, j'ai décidé d'essayer une méthode que j'ai trouvée chez intellisense et je veux m'assurer que c'est la bonne façon de le faire car je n'ai pas la chance de voir ce qui se passe dans les coulisses:

public void SaveOrder(Order order)
{
    using (VirtualWebEntities db = new VirtualWebEntities())
    {
        db.Orders.Attach(order);
        db.Entry(order).State = System.Data.Entity.EntityState.Modified;
        db.SaveChanges();
    }
}

Est-ce la bonne façon de mettre à jour un élément existant qui a été modifié?

54
KingOfHypocrites

Oui, c'est correct Cet article décrit différentes manières d'ajouter et d'attacher des entités , et il fournit cet exemple:

var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" };
using (var context = new BloggingContext())
{
    // The next step implicitly attaches the entity
    context.Entry(existingBlog).State = EntityState.Modified;
    // Do some more work...
    context.SaveChanges();
}

Etant donné que EF ne sait pas quelles propriétés sont différentes de celles de la base de données, toutes les met à jour:

Lorsque vous définissez l'état sur Modifié, toutes les propriétés de l'entité sont marquées comme modifiées et toutes les valeurs de propriété sont envoyées à la base de données lorsque SaveChanges est appelé.

Pour éviter cela, vous pouvez définir quelles propriétés sont modifiées manuellement plutôt que de définir l'état entier de l'entité:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Find(1);
    context.Entry(blog).Property(u => u.Name).IsModified = true;     
    // Use a string for the property name
    context.Entry(blog).Property("Name").IsModified = true;
}
88
Stephen Jennings