SORU
12 EKİM 2011, ÇARŞAMBA


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
12 EKİM 2011, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jana Williams

    Jana William

    17 AĞUSTOS 2011
  • Juan Carlos Candela Bordera

    Juan Carlos

    4 Mart 2009
  • Rachel Talbott

    Rachel Talbo

    26 Ocak 2011