web-dev-qa-db-fra.com

Pourquoi utiliser Attach pour mettre à jour Entity Framework 6?

Lors de la recherche des meilleures pratiques pour effectuer une opération CRUD via EF, j'ai remarqué qu'il est fortement recommandé d'utiliser les méthodes Attach() ou Find() avant de mettre à jour une entité. Cela fonctionne bien et selon la documentation EF, ces méthodes récupèrent l'entité dans un contexte qui est assez clair pour moi. Mais le code suivant m'a confondu à peu près

public void Update(object entity)
{
    Record record = new Record() {
        id = 1,
        value = 5
    };
    using (SomeContext ctx = new SomeContext())
    {
        ctx.Entry(record).State = EntityState.Modified;
        ctx.SaveChanges();
    }
}

Supposons que nous ayons un enregistrement avec id = 1 dans la base de données. À cette condition, le code ci-dessus mettra à jour l'enregistrement (définissez la valeur sur 5). La question est pourquoi ça marche? Et puis pourquoi devrais-je utiliser Attach()?. Autant que je sache, le dossier n'était en aucun cas lié au contexte. J'ai lu les chapitres pertinents de ce livre et le tutoriel mais ils utilisent l'approche à 2 requêtes. J'ai aussi surfé SO mais je n'ai pas trouvé de réponse à ma question. Aidez-moi avec des explications ou de bons documents, s'il vous plaît.

10
Vitalii Isaenko

Si vous avez une entité dont vous savez qu'elle existe déjà dans la base de données mais qui n'est pas actuellement suivie par le contexte - ce qui est vrai dans votre cas - alors vous pouvez dire au contexte de suivre l'entité à l'aide de la méthode Attach sur DbSet. Donc en résumé ce que fait la méthode Attach est de suivre l'entité dans le contexte et de changer son état en Unchanged. Lorsque vous modifiez une propriété après cela, les modifications de suivi changeront son état en Modified pour vous. Dans le cas que vous exposez ci-dessus, vous dites explicitement que l'état est Modified mais aussi pour attacher l'entité à votre contexte. Vous pouvez trouver une explication détaillée dans ce post .

Quand devez-vous utiliser la méthode Attach?

Lorsque vous avez une entité dont vous savez qu'elle existe déjà dans la base de données mais que vous souhaitez apporter des modifications:

var entity= new Entity{id=1};
context.YourDbSet.Attach(entity); 

// Do some change...  
entity.value=5;

context.SaveChanges(); 

C'est pareil:

 context.Entry(entity).State = EntityState.Unchanged; 

// Do some change... 
entity.value=5; 

context.SaveChanges(); 

Quand devez-vous changer explicitement l'état de l'entité en modifié?

Lorsque vous avez une entité dont vous savez qu'elle existe déjà dans la base de données mais que les modifications ont déjà été apportées. Le même scénario que votre exemple

24
octavioccl