2011-10-12 23 views
49

i sanal olarak benim modelinde varlık ilişkisi sonra benim LINQ sorgusunda Include deyimini kullanmaya gerek, ?? hemen orada beyan varsa -Varlık Framework 4.1 Sanal Özellikleri

ex

: Bu benim modeli sınıftır :

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 modeli sınıf için, i yok var brandsAndProduct = pe.Brands.Include("Products").Single(brand => brand.BrandID == 22); kullanmak gerekir.

Bunun yerine, sadece basit var brandsAndProduct = pe.Brands.Where(brand => brand.BrandID == 22); kullanabilir ve erişildiğinde ı otomatik ilişkili varlık mevcut olacaktır.

Anlayışımı düzeltir miyim? Ben diğer üzerinden bir tercih gereken durumlar

Ayrıca söyle lütfen ??

cevap

158

Haklısınız, ancak kural beklendiği gibi çalışmasını sağlamak için daha karmaşıktır. Navigasyon özelliğinizi tanımlarsanız virtual EF çalışma zamanında Brand sınıfınızdan türetilmiş yeni bir sınıf (dinamik proxy) oluşturur ve bunun yerine kullanır. Dinamik olarak oluşturulan bu yeni sınıf, ilk kez erişildiğinde gezinme özelliğini yüklemek için mantık içerir. Bu özellik tembel yükleme (veya daha iyi şeffaf tembel yükleme) denir. kurallar bu işi yapmak için bir araya gerekir Ne

: sınıfta

  • Tüm navigasyon özellikleri virtual
  • Dinamik vekil oluşturma devre dışı olmamalıdır olmalıdır (context.Configuration.ProxyCreationEnabled). Varsayılan olarak etkindir.
  • Tembel yükleme devre dışı bırakılmamalıdır (context.Configuration.LazyLoadingEnabled). Varsayılan olarak etkindir.
  • bağlam ve bağlama (eğer veritabanından varlık yüklerseniz varsayılan)
  • Varlık eklenmelidir atılmaması gerektiğini = geç yükleme sadece (veya proxy'li varlık bağlıydı yerde)
  • veritabanından yüklemek için kullanılır yaşayan bağlamda kapsamında çalışır

Tembel yüklemenin tersine istekli yükleme denir ve bu, Include'un yaptığı şeydir. Include'u kullanırsanız, navigasyon özelliğiniz ana varlıkla birlikte yüklenir. Tembel yükleme ve istekli yükleme

Kullanımı ihtiyaçlarınıza bağlıdır ve ayrıca performansa. Include, tüm verileri tek bir veritabanı sorgusunda yükler, ancak çok sayıda öğe kullanırken veya çok sayıda öğe yüklerken huge data set ile sonuçlanabilir. İşleme için Brand ve tüm Products'a ihtiyacınız olacağından eminseniz hevesli yükleme kullanmalısınız. Eğer gerekecektir navigasyon özelliği emin değilseniz

Geç yükleme sırayla kullanılır. Örneğin, 100 marka yüklüyorsanız ancak yalnızca bir markadan ürünlere erişmeniz gerekiyorsa, ilk sorgudaki tüm markalar için ürün yüklemek için gerekli değildir. Gecikmeli yüklemenin dezavantajı => dahil olmadan 100 marka yüklemek ve sizin kod bu gezinme özelliklerini doldurmak için başka 100 sorguları üretecektir her Brand durumda Products özelliği erişecek olursa = istekli her navigasyon özelliği için ayrı sorgu (veritabanı gidiş dönüş) olduğunu yükleme sadece singe sorgu kullanırdı ama tembel yükleme kullanılan 101 sorgu (N + 1 problemi denir).

Daha karmaşık senaryolarda, bu stratejilerin hiçbirinin gerekmedikçe performans göstermediğini ve marka yüklemek için ayrı yükleme veya ayrı sorgular olarak adlandırılan üçüncü stratejiyi ve ihtiyacınız olan tüm markalar için ürünlerden daha fazlasını kullanabileceğinizi görebilirsiniz.

Açık yükleme tembel yükleme gibi benzer dezavantajları vardır ama bunu elle tetiklemek gerekir: açık yükleme için

context.Entry(brand).Collection(b => b.Products).Load(); 

ana avantajları ilişkiyi filtre yeteneğidir. 'u Load()'dan önce kullanabilir ve iç içe geçmiş ilişkilerde herhangi bir süzme veya hatta istekli yükleme kullanabilirsiniz.

+3

Bu cevabın özlü ve eksiksiz olduğunu hissediyorum ... Teşekkürler. "İlgili Veriler Yükleme" http://msdn.microsoft.com/en-us/magazine/hh205756.aspx – Lijo

+0

Yanıtınız için teşekkür ederiz. Yine de bana 2016 yılında yardımcı oluyor. Ve bir sorum daha var: Tek bir çağrıda her özelliği istekli olarak yüklemek için herhangi bir yol var mı? Birden fazla gezinme özelliğine sahip ve her seferinde yüklenmesi gereken modellerin olduğu durumlar olduğu için. – anuith