2015-04-15 13 views
23

Entity Framework kurulumum var ve ihtiyacım olan çoğu zaman iyi çalışıyor.Entity Framework - Lazy Durdurma İlgili Kurumlar On Demand yükleniyor?

gibi bir yapim var. Gördüğünüz gibi listelerden bir dizi ilgili varlığa sahibim. Ben Topic.Posts veya Topic.TopicNotifications vb çağrı böylece bu

HasOptional(t => t.LastPost).WithOptionalDependent().Map(m => m.MapKey("Post_Id")); 
HasOptional(t => t.Poll).WithOptionalDependent().Map(m => m.MapKey("Poll_Id"));    
HasRequired(t => t.Category).WithMany(t => t.Topics).Map(m => m.MapKey("Category_Id")); 
HasRequired(t => t.User).WithMany(t => t.Topics).Map(m => m.MapKey("MembershipUser_Id")); 
HasMany(x => x.Posts).WithRequired(x => x.Topic).Map(x => x.MapKey("Topic_Id")).WillCascadeOnDelete(); 
HasMany(x => x.TopicNotifications).WithRequired(x => x.Topic).Map(x => x.MapKey("Topic_Id")).WillCascadeOnDelete(); 
HasMany(t => t.Tags) 
    .WithMany(t => t.Topics) 
    .Map(m => 
       { 
        m.ToTable("Topic_Tag"); 
        m.MapLeftKey("TopicTag_Id"); 
        m.MapRightKey("Topic_Id"); 
       }); 

Bu, tüm bir kuyu olduğunu ... (aşağıda Eşlemeleri'ni) standart olarak eşleştirilmiş ve yüklenen tembel vardır. Ama birkaç kez Topic.Posts ve Topic.Favori'leri elle doldurma ihtiyacım var. Ben denemek ve Topic.Posts = SomeCollection ayarlarsanız daha sonra ilk tembel yük ve yükleri tüm mesajlar tetikler ve Ama

beni çok ben (ilk ben istemiyorum)

yürütülen sql iki set almak koleksiyonumu ayarlamanıza izin verir

Yine de, koleksiyonu elle ayarlamak istediğimde tembel yükleme işlemini manuel olarak kapatmak için var mı?

mantıklı Umut ...: tembel yükleme kullanarak bu yana/

+5

Burada bir XY problemi var duyuyorum http://meta.stackexchange.com/a/66378/134199 - Bence GERÇEK problemin bu "Topic.Posts ve Topic.Favorites'i elle doldurmak gerekiyor". Muhtemelen, yaptığınız şey herhangi bir anlam ifade etmediğinden, çok daha iyi bir şekilde başarılmış bir şey yapmaya çalışıyorsunuzdur. Tam olarak ne yapmaya çalışıyorsun ... ve neden? –

+1

@ErikFunkenbusch'un söylediği şeyden bahsedeceğim. Yayınları ve Sık Kullanılanlar koleksiyonlarını neden manuel olarak yeniden oluşturmanız gerekiyor? –

+0

Yapmaya çalıştığınız şeyi yanıtlıyorsanız, aslında gerçek probleminizi çözmenize yardımcı olabiliriz. SİZİN DÜŞÜNDÜĞÜNDE DAHA SORUNDA OLMAYACAĞINIZ DAHA FAZLA OLMAYACAĞINIZ DÜŞÜNÜYORUZ. sorun. –

cevap

3

, size yakınlık sizin sınıflar ve toplama özellikleri için oluşturulan olması gerekir.

Bu vekil toplama özelliklerini kendi koleksiyonlarınızla değiştirmek bana oldukça garip bir tasarım gibi görünüyor. Değişim izlemeyi kaybedersiniz ve büyük olasılıkla birkaç başka garip yan etki kazanırsınız.

Proxy/tembel yükleme kullanımını ve koleksiyonları değiştirme fikrinden vazgeçmenizi veya proxy'leri kullanmaktan ve oluşturulan POCO sınıfları üzerinde tam denetim elde etmekten vazgeçmenizi tavsiye ederim.

İhtiyaçlarınız için her iki yaklaşımdan hangisi uygun olursa, varlık çerçevesinin genel kullanımınıza bağlıdır.

12

Bu tam senaryoyu hedefleyen bir yaklaşımın farkında değilim, bu nedenle geçici bir yükleme/geçici yükleme etkinliğine gitmem gerekir.

using(var context = new MyContext()) 
{ 
    context.Configuration.LazyLoadingEnabled = false; 
    // do your thing using .Include() or .Load() 
    context.Configuration.LazyLoadingEnabled = true; 
} 

Not Ancak bu senin senaryosunda olmuyorsa bir eşzamanlılık sorun olabilir bu yüzden bu global konfigürasyon olduğunu.

+1

Varlık nesnesinde bulunan nesnenin varlığını garanti edemeyeceğiniz için bu yaklaşıma karşı çıkacağım, bu nedenle, dahil edilen nesnelere erişmeye çalışmadan önce her zaman boş kayıtlar için test ettiğinizden emin olmanız gerekir. Çalışma sırasında Tembel Yükleme ve Proxy'leri açıp kapamanız çok fazla beklenmedik sonuç doğurabilir ve baş ağrısında hata ayıklama yapabilir. – AllMadHare

+2

@ AllMadHare: Katılıyorum. Çözümün çok daha iyi. –

+1

@JeroenVannevel Küresel bir mülk değil .. en azından EF 6'da değil. Küresel olarak kurmanın bir yolu olduğunu ve bu yapılandırmanın muhtemelen varsayılan/global olarak klonlandığını düşünün, ancak Yapılandırma (ve bu bayrak) örnek özelliklerdir . –

21

Tembel yüklemeyi varsayılan olarak kapatmak ve bunun yerine ilk önce ek verileri yüklemek istediğiniz zamanı belirtmek daha iyi olur. EF, Eager yüklemesinin sorgunuzdaki .Include() işlevini kullanarak yüklenmesine izin verecek şekilde ayarlanmıştır. Tembel yükleme, çeşitli işlevler için açma/kapama başlatırsanız dağınık olabilir, yalnızca kapatmak ve yönetmek daha iyidir. Verileri kapatmak istediğinizde ne zaman/ne yüklediğinizi düşünüyorsunuz.

Belirli örnekler ve yük vermeme/tembel davranmanın farklı yollarının ayrıştırılması için https://msdn.microsoft.com/en-nz/data/jj574232.aspx'a bakın. İlk örnek, blog'unuzdaki yayınları nasıl çekebileceğinizi gösterir. Bu, ne yapmak istediğinize benzer.

var topics = context.Topics 
         .Include(t => t.Posts) 
         .ToList(); 
8

İstek başı esasına göre tembellik yüklemesini kapatmayı önermem. AllMadHare'in önerdiği gibi, tembel yükleme işlemini tamamen kapatabilirdiniz, ancak bu değişiklikler tüm verileri nasıl yüklediğinize zorlayabilir.Burada bulunan belgelere Başına

public partial class Topic : Entity 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public DateTime CreateDate { get; set; } 
    public virtual Post LastPost { get; set; } 
    public virtual Category Category { get; set; } 
    public IList<Post> Posts { get; set; } 
    public virtual IList<TopicTag> Tags { get; set; } 
    public virtual MembershipUser User { get; set; } 
    public virtual IList<TopicNotification> TopicNotifications { get; set; } 
    public virtual IList<Favourite> Favourites { get; set; } 
    public virtual Poll Poll { get; set; } 
} 

: sınıf şuna benzer böylece Mesajlardan sanal anahtar kelimeyi kaldırmayı öneriyoruz https://msdn.microsoft.com/en-us/data/jj574232.aspx#lazyOffProperty bu tembel yüke sizi sağlayacak tüm diğer navigasyon özellikleri ve istekli yük mesajlar eğer gerekiyorsa .