Śledzenie programu vs. Zapytania dotyczące śledzenia nieTracking vs. No-Tracking Queries

Czy program Entity Framework Core przechowuje informacje o wystąpienia jednostek w jego śledzący zmiany do śledzenia kontroli zachowania.Tracking behavior controls whether or not Entity Framework Core will keep information about an entity instance in its change tracker. Jeśli śledzenia jednostki wykryto w jednostce wszelkie zmiany zostaną utrwalone w bazie danych podczas SaveChanges().If an entity is tracked, any changes detected in the entity will be persisted to the database during SaveChanges(). Entity Framework Core będzie również konfigurowania właściwości nawigacji między jednostek, które są uzyskiwane z zapytania śledzenia i jednostkami, które wcześniej zostały załadowane do wystąpienia typu DbContext.Entity Framework Core will also fix-up navigation properties between entities that are obtained from a tracking query and entities that were previously loaded into the DbContext instance.

Porada

Można wyświetlić w tym artykule próbki w witrynie GitHub.You can view this article's sample on GitHub.

Zapytania dotyczące śledzeniaTracking queries

Domyślnie są śledzenia zapytań, które zwracają typów jednostek.By default, queries that return entity types are tracking. Oznacza to, można wprowadzić zmiany do tych jednostek wystąpień i te zmiany utrwalonych przez SaveChanges().This means you can make changes to those entity instances and have those changes persisted by SaveChanges().

W poniższym przykładzie zostanie wykryte i utrwalone w bazie danych podczas zmiany klasyfikacji blogi SaveChanges().In the following example, the change to the blogs rating will be detected and persisted to the database during SaveChanges().

using (var context = new BloggingContext())
{
    var blog = context.Blogs.SingleOrDefault(b => b.BlogId == 1);
    blog.Rating = 5;
    context.SaveChanges();
}

Zapytania dotyczące śledzenia nieNo-tracking queries

Nie ma zapytań, śledzenia są przydatne, gdy wyniki są używane w scenariuszu tylko do odczytu.No tracking queries are useful when the results are used in a read-only scenario. Są one szybsze można wykonać operacji, ponieważ nie istnieje potrzeba aby informacje o monitorowaniu zmian konfiguracji.They are quicker to execute because there is no need to setup change tracking information.

Można wymienić poszczególnych zapytań do śledzenia nie można:You can swap an individual query to be no-tracking:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .AsNoTracking()
        .ToList();
}

Możesz również zmienić domyślne zachowanie na poziomie wystąpienia kontekstu śledzenia:You can also change the default tracking behavior at the context instance level:

using (var context = new BloggingContext())
{
    context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

    var blogs = context.Blogs.ToList();
}

Uwaga

Nie ma zapytań, śledzenie nadal rozpoznawać tożsamości w ramach zapytania przesłać.No tracking queries still perform identity resolution within the excuting query. Jeśli zestaw wyników zawiera tej samej jednostki wiele razy, zostanie zwrócony tego samego wystąpienia klasy jednostki dla każdego wystąpienia w zestawie wyników.If the result set contains the same entity multiple times, the same instance of the entity class will be returned for each occurrence in the result set. Jednak słabe odwołania są używane do śledzenia jednostek, które już zostały zwrócone.However, weak references are used to keep track of entities that have already been returned. Jeśli poprzedni wynik o tej samej tożsamości wykracza poza zakres i wyrzucanie elementów bezużytecznych działa, możesz uzyskać nowego wystąpienia jednostki.If a previous result with the same identity goes out of scope, and garbage collection runs, you may get a new entity instance. Aby uzyskać więcej informacji, zobacz jak działa zapytanie.For more information, see How Query Works.

Śledzenie i projekcjiTracking and projections

Nawet jeśli typu wyników zapytania nie jest typem jednostki, jeśli wynik zawiera typy jednostek one nadal będą śledzone przez domyślne.Even if the result type of the query isn't an entity type, if the result contains entity types they will still be tracked by default. W następującej kwerendy, która zwraca typu anonimowego wystąpienia Blog w wyniku będą śledzone zestawu.In the following query, which returns an anonymous type, the instances of Blog in the result set will be tracked.

using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Select(b =>
            new
            {
                Blog = b,
                Posts = b.Posts.Count()
            });
}

Jeśli zestaw wyników nie zawiera żadnych typów jednostek, przeprowadzane jest Brak śledzenia.If the result set does not contain any entity types, then no tracking is performed. W następującej kwerendy, który zwraca typ anonimowy w przypadku niektórych wartości z jednostki (ale nie wystąpień rzeczywistego typu jednostki) nie należy nie śledzenia wykonywane.In the following query, which returns an anonymous type with some of the values from the entity (but no instances of the actual entity type), there is no tracking performed.

using (var context = new BloggingContext())
{
    var blog = context.Blogs
        .Select(b =>
            new
            {
                Id = b.BlogId,
                Url = b.Url
            });
}