Önce Entity Framework Kodundaki nesneleri nasıl ayırırım?


Yanıtlar:


156

Mevcut nesneyi ayırmak istiyorsanız @ Slauma'nın tavsiyelerine uyun. Değişiklikleri izleme olmadan nesneleri yüklemek istiyorsanız şunu kullanın:

var data = context.MyEntities.AsNoTracking().Where(...).ToList();

Yorumda belirtildiği gibi, bu varlıkları tamamen ayırmayacaktır. Hala ekli ve tembel yükleme işleri var, ancak varlıklar izlenmiyor. Bu, örneğin varlığı yalnızca verileri okumak üzere yüklemek istiyorsanız ve bunları değiştirmeyi planlamıyorsanız kullanılmalıdır.


3
@Ladislav: Muhtemelen Lol kodlayıcının anlamı budur. Sıklıkla nesne listelerini yükleyip bağlamı aynı anda elimden geçirmeme rağmen bu yöntemi hiç kullanmadım ve düşünmedim using(ctx){ return ctx....ToList(); }. Bu gibi durumlarda kullanmak AsNoTracking()mantıklı olurdu çünkü gereksiz yere nesne içeriğini doldurmaktan tasarruf edeceğim. Muhtemelen özellikle büyük listeler için bir performans ve bellek tüketimi faydası olur, değil mi?
Slauma

1
@Slauma: Evet, performans avantajı var. Bu yüzden bu yöntem var. Bu yaklaşımı ObjectContext API'sinde kullanmak biraz daha karmaşıktır.
Ladislav Mrnka

2
Bu tembel yüklemeyi devre dışı bırakır mı?
Shawn Mclean

3
Aslında bu tembel yüklemeyi devre dışı bırakmayacak, sadece değişiklik izlemeyi devre dışı bırakacak ve performansı artıracak = varlık hala ekli. Bu soruyu cevapladıktan sonra buldum, bu yüzden @ Slauma'nın birini geçerli bir cevap olarak işaretlemelisin.
Ladislav Mrnka

1
İstediğim bu. Tembel yükleme ve sadece müstakil bir varlığı değiştirme yeteneği istiyorum.
Shawn Mclean

255

Bu bir seçenektir:

dbContext.Entry(entity).State = EntityState.Detached;

3
IQueryable döndüren nesneleri alırken bunu yapabilir miyim?
Shawn Mclean

1
@Lol kodlayıcı: Sizi doğru anladığımdan emin değilim, ancak entitymodel sınıflarınızın (Kişi, Müşteri, Sipariş vb.) Bir parçası olan materyalize bir nesne olmalıdır. Bir IQueryable <T> içine doğrudan geçemezsiniz dbContext.Entry(...). Demek istediğin soru bu mu?
Slauma

9
@EladBenda: Değişir. Bağlama zaten eklenmiş olan bir nesneyi ayırmak istiyorsanız, durumu olarak ayarlayın Detached. Varlıkları, bağlama hiç bağlamadan DB'den yüklemek istiyorsanız (değişiklik izleme yok) kullanın AsNoTracking.
Slauma

1
Bu yöntemle ilgili ilginç bir sorun buldum. Varlık bir proxy sınıfı olsa da, durumunu değiştirdikten sonra tembel yükleme çalışmaz Detached.
kjbartel

4
@kjbartel: varlığın bağlamla bağlantısı olmadığından bu beklenen davranıştır.
Ricardo Souza
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.