.AsNoTracking () ne fark eder?


228

.AsNoTracking()Uzatma ile ilgili bir sorum var , çünkü bunlar tamamen yeni ve oldukça kafa karıştırıcı.

Bir web sitesi için istek başına bağlam kullanıyorum.

Varlıklarımın çoğu değişmez, bu yüzden takip edilmesi gerekmez, ancak veritabanına ne gittiğinden emin olmadığım ya da bu durumda bir fark yaratıp yaratmadığından emin olmadığım aşağıdaki senaryo var.

Bu örnek şu anda yaptığım şey:

context.Set<User>().AsNoTracking()
// Step 1) Get user
context.Set<User>()
// Step 2) Update user

Bu yukarıdakiyle aynıdır ancak 1. Adımdan kaldırılır .AsNoTracking():

context.Set<User>();
// Step 1) Get user
context.Set<User>()
// Step 2) Update user

Adım 1 ve 2 aynı bağlamı kullanır, ancak farklı zamanlarda gerçekleşir. Çözemediğim herhangi bir fark olup olmadığı. Adım 2 bir güncelleme olduğu için her ikisi de zaten iki kez veritabanına çarpacak tahmin ediyorum.

Birisi bana farkın ne olduğunu söyleyebilir mi?

Yanıtlar:


187

Fark, ilk durumda, geri alınan kullanıcının bağlam tarafından izlenmemesidir, böylece kullanıcıyı veritabanına geri kaydedeceğiniz zaman, onu eklemeniz ve EF'in mevcut kullanıcıyı güncellemesi gerektiğini bilmesi için kullanıcının doğru durumunu ayarlamanız gerekir. yeni bir tane eklemek yerine. İkinci durumda, kullanıcıyı aynı bağlam örneğiyle yükleyip kaydederseniz bunu yapmanıza gerek yoktur çünkü izleme mekanizması bunu sizin için yapar.


1
Bağlam.Users.Select (u => new {Name = u.Name}) gibi seçme sorgusunda anonim sınıflar için aynı avantajları elde edebilir miyiz? Teşekkürler.
Dilhan Jayathilake

6
@DilhanJayathilake: Anonim sınıflar varlığın kendisini temsil etmez, bu nedenle takibi yoktur.
Ladislav Mrnka

1
EF6 bazen görünümde varlık anahtarını yanlış bir şekilde ihlal ettiğinden, AsNoTracking () anahtarı yok sayar ve bu nedenle anahtarı manuel olarak düzeltmeye bir alternatif olabilir (anahtarın diğer faydalarına gerek olmadığı varsayılarak).
crokusek

4
Ayrıca, AsNoTracking'in sahip olduğu en büyük etkinin tembel yüklemenin işe yaramayacağıdır
Douglas Gaskell

170

bu sayfaya bakın Entity Framework ve AsNoTracking

AsNoTracking Ne Yapar

Entity Framework, uygulamalarınızın performansını optimize etmenize yardımcı olmak için bir dizi performans ayarlama seçeneği sunar. Bu ayar seçeneklerinden biri .AsNoTracking(). Bu optimizasyon Entity Framework, bir sorgunun sonuçlarını izlememenizi söylemenizi sağlar . Bu Entity Framework, sorgu tarafından döndürülen varlıkların ek işlemesini veya depolanmasını gerçekleştirmez. Ancak, bu varlıkları izleme grafiğine yeniden eklemeden de güncelleyemeyeceğiniz anlamına gelir.

AsNoTracking kullanılarak elde edilecek önemli performans kazançları var


11
Kazançlar bazen dengelenebilir gibi görünüyor: stackoverflow.com/questions/9259480/…
Fabrice

3
Bir ebeveyn çocuk ilişkisini yükleyen karmaşık bir sorgu ile performans
Karl

53

Varlık sorguları için İzleme LINQ yok

Sorgunuzun okuma işlemleri için kullanılması durumunda AsNoTracking () kullanılması önerilir. Bu senaryolarda, varlıklarınızı geri alırsınız, ancak bağlamınıza göre izlenmezler.Bu, minimum bellek kullanımı ve optimum performans sağlar

Artıları

  1. Düzenli LINQ sorgularına göre gelişmiş performans.
  2. Tamamen somutlaşmış nesneler.
  3. Programlama dilinde yerleşik sözdizimi ile yazmak en basitidir.

Eksileri

  1. CUD işlemleri için uygun değildir.
  2. Bazı teknik kısıtlamalar, örneğin: OUTER JOIN sorguları için DefaultIfEmpty kullanan desenler, Entity SQL'deki basit OUTER JOIN ifadelerinden daha karmaşık sorgulara neden olur.
  3. Genel desen eşleşmesi ile LIKE'yi hala kullanamazsınız.

Daha fazla bilgi burada:

Varlık Çerçevesi için performans değerlendirmeleri

Varlık Çerçevesi ve NoTracking



10

AsNoTracking (), EF'deki "kayıt başına benzersiz anahtar" gereksiniminin atlanmasına izin verir (diğer yanıtlar tarafından açıkça belirtilmez).

Bu, benzersiz bir anahtarı desteklemeyen bir Görünümü okurken son derece yararlıdır, çünkü belki de bazı alanlar boş bırakılabilir veya görünümün yapısı mantıksal olarak dizine eklenemez.

Bu durumlarda "anahtar" boş bırakılamaz herhangi bir sütuna ayarlanabilir ancak daha sonra her sorguda AsNoTracking () kullanılmalıdır.


2
Sadece Views ile bunun önemini yinelemek için, SSMS ile çalıştırıldığında 7 benzersiz kayıt döndüren bir görünümden bir sorgu var. EF üzerinden çalıştırıldığında, AsNoTracking değiştiricisi olmadan, ilk kaydı, ikinci kopyasının üç kopyasını ve üçüncüsünün üç kopyasını alıyorum. Bu, düzeltmek için inanılmaz kafa kaşıma aldı ve bunu düzelten AsNoTracking'i kullanıyordu!
Ade

Birincil anahtarları olmayan bir görünümü sorgularken Linq to Entities kullanırken bu aynı sorunu vardı. AsNoTracking'i yalnızca yarım günlük kafa tırmalamasından sonra öğrendim. Bu ASP.Net forum gönderisi sonunda beni buna yönlendirdi. forums.asp.net/t/…
red_dorian

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.