Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette rubrique explique comment ajouter et attacher des entités à un contexte et comment Entity Framework les traite pendant SaveChanges. Entity Framework s’occupe du suivi de l’état des entités pendant qu’elles sont connectées à un contexte, mais dans des scénarios déconnectés ou multiniveau, vous pouvez indiquer à EF quel état vos entités doivent se trouver. Les techniques présentées dans cette rubrique s’appliquent également aux modèles créés avec Code First et EF Designer.
États d’entité et SaveChanges
Une entité peut se trouver dans l’un des cinq états définis par l’énumération EntityState. Ces états sont les suivants :
- Ajout : l’entité est suivie par le contexte, mais n’existe pas encore dans la base de données
- Inchangé : l’entité est suivie par le contexte et existe dans la base de données, et ses valeurs de propriété n’ont pas changé à partir des valeurs de la base de données
- Modifié : l’entité est suivie par le contexte et existe dans la base de données, et certaines ou toutes ses valeurs de propriété ont été modifiées
- Supprimé : l’entité est suivie par le contexte et existe dans la base de données, mais a été marquée pour suppression de la base de données la prochaine fois que SaveChanges est appelé
- Détaché : l’entité n’est pas suivie par le contexte
SaveChanges effectue différentes opérations pour les entités dans différents états :
- Les entités inchangées ne sont pas touchées par SaveChanges. Les mises à jour ne sont pas envoyées à la base de données pour les entités dans l’état inchangé.
- Les entités ajoutées sont insérées dans la base de données, puis deviennent inchangées lorsque SaveChanges retourne.
- Les entités modifiées sont mises à jour dans la base de données, puis deviennent inchangées lorsque SaveChanges retourne.
- Les entités supprimées sont supprimées de la base de données et sont ensuite détachées du contexte.
Les exemples suivants montrent comment modifier l’état d’une entité ou d’un graphique d’entité.
Ajout d’une nouvelle entité au contexte
Une nouvelle entité peut être ajoutée au contexte en appelant la méthode Add sur DbSet. Cela place l’entité dans l’état Ajouté, ce qui signifie qu’elle sera insérée dans la base de données la prochaine fois que SaveChanges est appelé. Par exemple:
using (var context = new BloggingContext())
{
var blog = new Blog { Name = "ADO.NET Blog" };
context.Blogs.Add(blog);
context.SaveChanges();
}
Une autre façon d’ajouter une nouvelle entité au contexte consiste à modifier son état en Ajout. Par exemple:
using (var context = new BloggingContext())
{
var blog = new Blog { Name = "ADO.NET Blog" };
context.Entry(blog).State = EntityState.Added;
context.SaveChanges();
}
Enfin, vous pouvez ajouter une nouvelle entité au contexte en la connectant à une autre entité déjà suivie. Cela peut être en ajoutant la nouvelle entité à la propriété de navigation de collection d’une autre entité ou en définissant une propriété de navigation de référence d’une autre entité pour pointer vers la nouvelle entité. Par exemple:
using (var context = new BloggingContext())
{
// Add a new User by setting a reference from a tracked Blog
var blog = context.Blogs.Find(1);
blog.Owner = new User { UserName = "johndoe1987" };
// Add a new Post by adding to the collection of a tracked Blog
blog.Posts.Add(new Post { Name = "How to Add Entities" });
context.SaveChanges();
}
Notez que pour tous ces exemples si l’entité ajoutée a des références à d’autres entités qui ne sont pas encore suivies, ces nouvelles entités seront également ajoutées au contexte et seront insérées dans la base de données la prochaine fois que SaveChanges est appelé.
Attachement d’une entité existante au contexte
Si vous disposez d’une entité que vous connaissez déjà dans la base de données, mais qui n’est pas actuellement suivie par le contexte, vous pouvez indiquer au contexte de suivre l’entité à l’aide de la méthode Attach sur DbSet. L’entité sera dans l’état inchangé dans le contexte. Par exemple:
var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" };
using (var context = new BloggingContext())
{
context.Blogs.Attach(existingBlog);
// Do some more work...
context.SaveChanges();
}
Notez qu’aucune modification n’est apportée à la base de données si SaveChanges est appelé sans effectuer d’autre manipulation de l’entité jointe. Cela est dû au fait que l’entité est dans l’état inchangé.
Une autre façon d’attacher une entité existante au contexte consiste à remplacer son état par Inchangé. Par exemple:
var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" };
using (var context = new BloggingContext())
{
context.Entry(existingBlog).State = EntityState.Unchanged;
// Do some more work...
context.SaveChanges();
}
Notez que pour ces deux exemples, si l’entité attachée a des références à d’autres entités qui ne sont pas encore suivies, ces nouvelles entités seront également attachées au contexte dans l’état inchangé.
Attachement d’une entité existante mais modifiée au contexte
Si vous disposez d’une entité que vous connaissez déjà dans la base de données, mais que des modifications peuvent avoir été apportées, vous pouvez indiquer au contexte d’attacher l’entité et définir son état sur Modified. Par exemple:
var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" };
using (var context = new BloggingContext())
{
context.Entry(existingBlog).State = EntityState.Modified;
// Do some more work...
context.SaveChanges();
}
Lorsque vous changez l'état en Modifié, toutes les propriétés de l'entité seront marquées comme modifiées, et toutes les valeurs de propriété seront envoyées à la base de données lorsque SaveChanges est invoqué.
Notez que si l’entité attachée a des références à d’autres entités qui ne sont pas encore suivies, ces nouvelles entités seront attachées au contexte dans l’état inchangé. Elles ne seront pas automatiquement modifiées. Si vous avez plusieurs entités qui doivent être marquées Modifiées, vous devez définir l’état de chacune de ces entités individuellement.
Modification de l’état d’une entité suivie
Vous pouvez modifier l’état d’une entité déjà suivie en définissant la propriété State de cette entité. Par exemple:
var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" };
using (var context = new BloggingContext())
{
context.Blogs.Attach(existingBlog);
context.Entry(existingBlog).State = EntityState.Unchanged;
// Do some more work...
context.SaveChanges();
}
Notez que l'appel des méthodes Add ou Attach pour une entité déjà suivie permet également de modifier l’état de l’entité. Par exemple, l'appel de la fonction Attach pour une entité actuellement dans l'état Ajouté changera son état à Inchangé.
Insérer ou mettre à jour le modèle
Un modèle courant pour certaines applications consiste à ajouter une entité en tant que nouvelle (entraînant une insertion de base de données) ou à attacher une entité comme existante et à la marquer comme modifiée (entraînant une mise à jour de base de données) en fonction de la valeur de la clé primaire. Par exemple, lors de l’utilisation de clés primaires entières générées par la base de données, il est courant de traiter une entité avec une clé zéro comme nouvelle et une entité avec une clé non nulle comme existante. Ce modèle peut être obtenu en définissant l’état de l’entité en fonction d’une vérification de la valeur de clé primaire. Par exemple:
public void InsertOrUpdate(Blog blog)
{
using (var context = new BloggingContext())
{
context.Entry(blog).State = blog.BlogId == 0 ?
EntityState.Added :
EntityState.Modified;
context.SaveChanges();
}
}
Notez que lorsque vous modifiez l’état en Modifié toutes les propriétés de l’entité sont marquées comme modifiées et que toutes les valeurs de propriété sont envoyées à la base de données lorsque SaveChanges est appelé.