Varlık Çerçevesi 4.1 Sanal Özellikleri
Eğer benim modelde varlık ilişki sanal olarak ilan ediyorum eğer SERİ benim sorguda Include
deyim, değil mi gerek yok ??-
Ex için: Bu model benim sınıf
public class Brand
{
public int BrandID { get; set; }
public string BrandName { get; set; }
public string BrandDesc { get; set; }
public string BrandUrl { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
Şimdi, yukarıdaki model sınıfı için, i var barndsAndProduct = pe.Brands.Include("Products").Single(brand => brand.BrandID == 22);
kullanmak gerekir .
Bunun yerine, sadece basit var barndsAndProduct = pe.Brands.Where(brand => brand.BrandID == 22);
kullanabilirim ve otomatik olarak ilgili varlık kullanılabilir olduğunda erişilebilir olacak.
Doğru anlayışımla mıyım ?
Ayrıca, diğer üzerinden bir tercih etmeliyim ne söyle ??
CEVAP
Haklısın ama kural beklendiği gibi daha karmaşık gerçekten iş yapmak. Navigation özellik tanımlarsanız virtual
EF çalışma zamanında yeni bir sınıf (dinamik proxy) Brand
sınıftan türetilmiş oluşturun ve kullanın. Dinamik olarak oluşturulan bu yeni sınıf mantık ilk kez erişildiğinde navigasyon özelliği yüklemek için içerir. Bu özellik, tembel yükleme (veya daha şeffaf tembel yükleme) denir.
Kurallar olmalı ne bu işi yapmak için uygun
- Sınıftaki tüm navigasyon özellikleri
virtual
olmalıdır - Dinamik proxy oluşturma devre dışı (
context.Configuration.ProxyCreationEnabled
) olmalıdır. Varsayılan olarak etkinleştirilir. - Tembel yükleme devre dışı (**10) olmalıdır. Varsayılan olarak etkinleştirilir.
- Varlık olmalı bağlı (varsayılan eğer size yük varlıktan veritabanı) bağlam ve bağlam olmalıdır bertaraf = tembel yükleme çalışır kapsamında yaşam içerik yüklemek için kullanılan bu veritabanı (veya vekalet edilen varlık bağlı)
Tembel yükleme tam tersi istekli yükleme denir ve bu Include
yapıyor. Eğer Include
kullanıyorsanız navigasyon özelliği birlikte ana kurum ile yüklenir.
Tembel yükleme ve istekli yükleme kullanımı performans ihtiyaçlarına da bağlıdır. Include
tek bir veritabanı sorgu ve veri yükleri içerir ama bir sürü kullanarak varlıkları ya da bir sürü yüklerken huge data set neden olabilir. Eğer Brand
ve işleme için Products
gerekir eminseniz istekli yükleme kullanmalısınız.
Tembel yükleme sırayla eğer navigasyon özelliği gerekir eminseniz kullanılmaz. 100 marka ama sadece ürünlere erişmek için bir marka gerekir yük, örneğin ilk sorguda tüm markalar için Ürün yüklemek için gerekli değildir. Tembel yükleme dezavantajı = ^ her navigasyon özelliği için ayrı query (veritabanı gidiş dönüş). eğer size yük olmadan 100 marka vardır ve sen-ecek erişim Products
özellik her Brand
örnek kod oluşturur bir 100 sorgular doldurmak için bu navigasyon özellikleri = istekli yükleme bunun için sadece tek bir sorgu ama tembel yükleme kullanılan 101 sorgular (adı N 1 sorun).
Daha karmaşık senaryolar bulabileceğiniz de bu stratejileri gerçekleştirmek için ihtiyaç duyduğunuz ve kullanabilirsiniz ya da üçüncü strateji olarak adlandırılan açık yükleme veya ayrı sorguları yük markalar ve ürünler için tüm markalar gerekir.
Açık yükleme tembel yükleme gibi benzer dezavantajları vardır ama elle tetiklemek gerekir:
context.Entry(brand).Collection(b => b.Products).Load();
Açık yükleme için ana avantajları filtre ilişki için yeteneğidir. Load()
önce Query()
kullanımı ve iç içe geçmiş ilişkiler filtreleme hatta istekli herhangi bir yükleme kullanabilirsiniz.
Sanal anahtar kelime Varlık Çerçevesi ...
Varlık Çerçevesi Özellikleri Birden ço...
Varlık Çerçevesi nesnelerin 1000'...
Varlık Çerçevesi - Navigasyon Özelliği...
Sistemi Kullanarak.ComponentModel.Varl...