6

Bir MVC projesinde EF 4.1 ve kod ilk kullanıyorum ve modelleri görüntülemek için varlıkları eşlemek için AutoMapper.Öğeleri tembel yüklü özelliklerle nasıl eşleştirebilirim (yüklemelerine gerek kalmadan)?

Kod ilk önce kullanmadan önce, yüklü olmayan bir şeyin yüklenmesini önlemek için gezinme özelliklerini hariç tutabiliyordum. Ek veritabanı gidiş-dönüşlerinden kaçınmak için ihtiyacım olan referansları eklemek için sorgularımda .Include() kullanıyorum.

Ancak, ilk önce, benim varlığım yalnızca bir varlık özelliğini (veya birden fazla varsa, ICollection) ortaya çıkarır. Yükü tetiklemeden yüklenip yüklenmediğini nasıl bilebilirim?

Bunu yapabileceğinizi varsayarsak, AutoMapper için varsayılan davranışı yapmanın bir yolu var mıdır, böylece üyeleri her bir varlıkta açıkça dışlamak zorunda kalmamalı mıyım?

cevap

10

kontrol edebilirsiniz EF Kodu İlk olarak, yalnızca sanal olarak işaretlenen özellikler için tembel yükleme yapar (bunları geçersiz kılabilir ve bunun yerine DynamicProxy'yi yerleştirebilir). Mülkünüzü sanal yapmazsanız, bu özellik için tembel yükleme özelliğini kapatırsınız.

+1

Teşekkürler, ihtiyacım olan şey bu. İçeriğe ihtiyacım olması çok kötü, bunun yerine benim depoda bazı yardımcıları eklemek zorunda kalabilir. –

2

Sen tembel-yükleme kapatarak onları explicitly load mümkün olmalıdır:

bool isLoaded1 = dbContext.Entry(entity).Reference(e => e.MyReferenceProperty) 
        .IsLoaded(); 
bool isLoaded2 = dbContext.Entry(entity).Collection(e => e.MyCollectionProperty) 
        .IsLoaded(); 
+1

EF4.1 ve Code-First ile birlikte POCO'ları olduğunu düşünüyorum, bu yüzden navigasyon özelliklerinde "IsLoaded" ve "Load" mevcut olmayacak. – Slauma

+0

Teşekkürler, tembel yükleme özelliğini devre dışı bırakmak da bir seçenek olabilir - en iyi olanı görür. –

4

: Bir entity bir referans ya da toplama navigasyon özelliği ile yüklenmiş olup olmadığını

using(var context = new FooBarEntities()) 
{ 
    context.ContextOptions.LazyLoadingEnabled = false; 
    Foo foo = context.Foo.Where(x => x.Id == myId).Single(); 
    ... 
    if(!foo.Bars.IsLoaded) 
    { 
     foo.Bars.Load(); 
    } 
    //do something with foo.Bars here 
}