Entity Framework
Suivi ou non suivi
Recherche…
Remarques
Le comportement de suivi détermine si Entity Framework conservera ou non des informations sur une instance d'entité dans son outil de suivi des modifications. Si une entité est suivie, toutes les modifications détectées dans l'entité seront conservées dans la base de données pendant SaveChanges()
.
Suivi des requêtes
- Par défaut, les requêtes renvoyant des types d'entités sont suivies
- Cela signifie que vous pouvez apporter des modifications à ces instances d'entité et que ces modifications sont conservées par
SaveChanges()
Exemple :
- La modification de la notation du
book
sera détectée et persistante dans la base de données pendantSaveChanges()
.
using (var context = new BookContext())
{
var book = context.Books.FirstOrDefault(b => b.BookId == 1);
book.Rating = 5;
context.SaveChanges();
}
Requêtes sans suivi
- Aucune requête de suivi n'est utile lorsque les résultats sont utilisés dans un scénario en
read-only
- Ils sont
quicker to execute
car il n'est pas nécessaire de configurer les informations de suivi des modifications.
Exemple :
using (var context = new BookContext())
{
var books = context.Books.AsNoTracking().ToList();
}
Avec EF Core 1.0, vous pouvez également modifier le comportement de suivi par défaut au niveau de l' context instance
.
Exemple :
using (var context = new BookContext())
{
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var books = context.Books.ToList();
}
Suivi et projections
- Même si le type de résultat de la requête n'est pas un type d'entité, si le résultat
contains entity
types d'contains entity
ils seront toujourstracked by default
Exemple :
Dans la requête suivante, qui renvoie un
anonymous type
, les instances deBook
dans le jeu de résultatswill be tracked
using (var context = new BookContext()) { var book = context.Books.Select(b => new { Book = b, Authors = b.Authors.Count() }); }
Si le jeu de résultats
does not
contient aucun type d'entity
,no tracking
n'est effectué
Exemple :
Dans la requête suivante, qui renvoie un
anonymous type
avec certaines des valeurs de l'entité (maisno instances
du type d'entity
réel), aucun suivi n'est effectué.using (var context = new BookContext()) { var book = context.Books.Select(b => new { Id = b.BookId, PublishedDate = b.Date }); }