İzleme ve İzleme Yok SorgularıTracking vs. No-Tracking Queries

Entity Framework Core, değişiklik izleyicisinde bir varlık örneği hakkında bilgi tutacaksa davranış denetimlerini izleme.Tracking behavior controls if Entity Framework Core will keep information about an entity instance in its change tracker. Bir varlık izlenirse, varlıkta algılanan tüm değişiklikler SaveChanges()veritabanında kalıcı olarak süre.If an entity is tracked, any changes detected in the entity will be persisted to the database during SaveChanges(). EF Core ayrıca, izleme sorgusu sonucundaki varlıklar la değişiklik izleyicisi içinde bulunan varlıklar arasındaki gezinti özelliklerini de düzeltecektir.EF Core will also fix up navigation properties between the entities in a tracking query result and the entities that are in the change tracker.

Not

Anahtarsız varlık türleri hiçbir zaman izlenmez.Keyless entity types are never tracked. Bu makalede varlık türleri nerede belirtilirse belirtilsin, anahtar tanımlanmış varlık türlerini ifade eder.Wherever this article mentions entity types, it refers to entity types which have a key defined.

İpucu

Bu makalenin örneğini GitHub'da görüntüleyebilirsiniz.You can view this article's sample on GitHub.

Sorguları izlemeTracking queries

Varsayılan olarak, varlık türlerini döndüren sorgular izlenir.By default, queries that return entity types are tracking. Bu da, bu varlık örneklerinde değişiklik yapabileceğiniz ve SaveChanges()bu değişiklikleri kalıcı hale getirebileceğiniz anlamına gelir.Which means you can make changes to those entity instances and have those changes persisted by SaveChanges(). Aşağıdaki örnekte, bloglar derecelendirmesinde yapılan değişiklik algılanır ve veritabanına devam eder. SaveChanges()In the following example, the change to the blogs rating will be detected and persisted to the database during SaveChanges().

var blog = context.Blogs.SingleOrDefault(b => b.BlogId == 1);
blog.Rating = 5;
context.SaveChanges();

Sorguları izlememeNo-tracking queries

Sonuçlar salt okunur senaryoda kullanıldığında hiçbir izleme sorgusu yararlıdır.No tracking queries are useful when the results are used in a read-only scenario. Değişiklik izleme bilgilerini ayarlamaya gerek olmadığından daha hızlı yürütülürler.They're quicker to execute because there's no need to set up the change tracking information. Veritabanından alınan varlıkları güncelleştirmeniz gerekmiyorsa, izleme sorgusu kullanılmamalıdır.If you don't need to update the entities retrieved from the database, then a no-tracking query should be used. Tek bir sorguyu izlememek için değiştirebilirsiniz.You can swap an individual query to be no-tracking.

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

Bağlam örneği düzeyinde varsayılan izleme davranışını da değiştirebilirsiniz:You can also change the default tracking behavior at the context instance level:

context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

var blogs = context.Blogs.ToList();

Kimlik çözünürlüğüIdentity resolution

Bir izleme sorgusu değişiklik izleyicisini kullandığından, EF Core bir izleme sorgusunda kimlik çözümlemesi yapar.Since a tracking query uses the change tracker, EF Core will do identity resolution in a tracking query. Bir varlığı somutlaştırırken, EF Core zaten izleniyorsa aynı varlık örneğini değişim izleyicisinden döndürecektir.When materializing an entity, EF Core will return the same entity instance from the change tracker if it's already being tracked. Sonuç aynı varlığı birden çok kez içeriyorsa, her oluşum için aynı örneği geri alırsınız.If the result contains same entity multiple times, you get back same instance for each occurrence. İzleme olmayan sorgular değişiklik izleyicisini kullanmaz ve kimlik çözümlemesi yapmaz.No-tracking queries don't use the change tracker and don't do identity resolution. Böylece, aynı varlık sonucu birden çok kez içerse bile yeni varlık örneğini geri alırsınız.So you get back new instance of entity even when the same entity is contained in the result multiple times. Bu davranış, EF Core 3.0'dan önceki sürümlerde farklıydı, önceki sürümlerbakın.This behavior was different in versions before EF Core 3.0, see previous versions.

İzleme ve özel projeksiyonlarTracking and custom projections

Sorgunun sonuç türü bir varlık türü olmasa bile, EF Core varsayılan olarak sonuçta bulunan varlık türlerini izlemeye devam eder.Even if the result type of the query isn't an entity type, EF Core will still track entity types contained in the result by default. Anonim bir türü döndüren aşağıdaki Blog sorguda, sonuç kümesindeki örnekler izlenir.In the following query, which returns an anonymous type, the instances of Blog in the result set will be tracked.

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

Sonuç kümesi LINQ kompozisyonundan çıkan varlık türlerini içeriyorsa, EF Core bunları izler.If the result set contains entity types coming out from LINQ composition, EF Core will track them.

var blog = context.Blogs
    .Select(b =>
        new
        {
            Blog = b,
            Post = b.Posts.OrderBy(p => p.Rating).LastOrDefault()
        });

Sonuç kümesi herhangi bir varlık türü içermiyorsa, izleme yapılmaz.If the result set doesn't contain any entity types, then no tracking is done. Aşağıdaki sorguda, varlıktan bazı değerlerle anonim bir tür döndürür (ancak gerçek varlık türünün örnekleri yoktur).In the following query, we return an anonymous type with some of the values from the entity (but no instances of the actual entity type). Sorgudan gelen izlenen varlıklar yok.There are no tracked entities coming out of the query.

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

EF Core, üst düzey projeksiyonda müşteri değerlendirmesini desteklemektedir.EF Core supports doing client evaluation in the top-level projection. EF Core, istemci değerlendirmesi için bir varlık örneğini somutlaştırırsa, izlenir.If EF Core materializes an entity instance for client evaluation, it will be tracked. Burada, varlıkları istemci blog yöntemine StandardizeURLaktardığımız için, EF Core blog örneklerini de izleyecektir.Here, since we're passing blog entities to the client method StandardizeURL, EF Core will track the blog instances too.

var blogs = context.Blogs
    .OrderByDescending(blog => blog.Rating)
    .Select(blog => new
    {
        Id = blog.BlogId,
        Url = StandardizeUrl(blog)
    })
    .ToList();
public static string StandardizeUrl(Blog blog)
{
    var url = blog.Url.ToLower();

    if (!url.StartsWith("http://"))
    {
        url = string.Concat("http://", url);
    }

    return url;
}

EF Core, sonuçta yer alan anahtarsız varlık örneklerini izlemez.EF Core doesn't track the keyless entity instances contained in the result. Ancak EF Core, yukarıdaki kurallara göre anahtarla varlık türlerinin diğer tüm örneklerini izler.But EF Core tracks all the other instances of entity types with key according to rules above.

Yukarıdaki kurallardan bazıları EF Core 3.0'dan önce farklı şekilde çalıştı.Some of the above rules worked differently before EF Core 3.0. Daha fazla bilgi için önceki sürümler'ebakın.For more information, see previous versions.

Önceki sürümlerPrevious versions

Sürüm 3.0'dan önce, EF Core izlemenin nasıl yapıldığı konusunda bazı farklılıklar vardı.Before version 3.0, EF Core had some differences in how tracking was done. Önemli farklılıklar şunlardır:Notable differences are as follows:

  • İstemci vs Sunucu Değerlendirmesi sayfasında açıklandığı gibi, EF Core sürüm 3.0'dan önce sorgunun herhangi bir bölümünde istemci değerlendirmesini desteklemişti.As explained in Client vs Server Evaluation page, EF Core supported client evaluation in any part of the query before version 3.0. İstemci değerlendirmesi, sonucun bir parçası olmayan varlıkların somutlaşmasına neden oldu.Client evaluation caused materialization of entities, which weren't part of the result. Böylece EF Core ne izlenir bulmak için sonucu analiz etti. Bu tasarım aşağıdaki gibi bazı farklılıklar vardı:So EF Core analyzed the result to detect what to track. This design had certain differences as follows:

    • Projeksiyondaki müşteri değerlendirmesi, maddeleşmeye neden oldu ancak maddeleşmiş varlık örneğini döndürmedi izlenmedi.Client evaluation in the projection, which caused materialization but didn't return the materialized entity instance wasn't tracked. Aşağıdaki örnek varlıkları izlemedi. blogThe following example didn't track blog entities.

      var blogs = context.Blogs
          .OrderByDescending(blog => blog.Rating)
          .Select(blog => new
          {
              Id = blog.BlogId,
              Url = StandardizeUrl(blog)
          })
          .ToList();
      
    • EF Core bazı durumlarda LINQ bileşiminden çıkan nesneleri izlemedi.EF Core didn't track the objects coming out of LINQ composition in certain cases. Aşağıdaki örnek izlemedi. PostThe following example didn't track Post.

      var blog = context.Blogs
          .Select(b =>
              new
              {
                  Blog = b,
                  Post = b.Posts.OrderBy(p => p.Rating).LastOrDefault()
              });
      
  • Sorgu sonuçları anahtarsız varlık türleri içerse, tüm sorgu izleme denmeye niçin yapılırdı.Whenever query results contained keyless entity types, the whole query was made non-tracking. Bu, sonuç olarak anahtarlı varlık türlerinin de izlenmediği anlamına gelir.That means that entity types with keys, which are in result weren't being tracked either.

  • EF Core, izleme sorgusunda kimlik çözümlemesi yaptı.EF Core did identity resolution in no-tracking query. Zaten döndürülmüş olan varlıkları izlemek için zayıf başvurular kullanılır.It used weak references to keep track of entities that had already been returned. Bu nedenle, bir sonuç kümesi aynı varlığın katları kez içeriyorsa, her oluşum için aynı örneği alırsınız.So if a result set contained the same entity multiples times, you would get the same instance for each occurrence. Aynı kimliğe sahip önceki bir sonuç kapsam dışına çıkmış ve çöp toplanmış olsa da, EF Core yeni bir örnek döndürdü.Though if a previous result with the same identity went out of scope and got garbage collected, EF Core returned a new instance.