2012-05-25 11 views
36

EF 4.3.1 modelimde 200 tane tek tablo var. İlk başlangıç ​​korkunç, birkaç dakika. DotTrace tarafından yakalanan bir profil, burada bir dizi yönteme yapılan çağrıların ve 36 milyon IEnumerable.Contains() çağrısının da gösterdiği gibi, bazı derin algoritmalar/ölçeklenebilirlik seçenekleri çerçevesinde derinlemesine ortaya çıkmaktadır. İşte bir pasaj, hepsi bu veritabanında yapılan ilk sorgu tarafından tetiklenir (gelecekteki sorgular bunu yapmaz ve iyidir).Varlık Çerçeve başlatma SLOW - daha hızlı önyükleme yapmak için ne yapabilirim?

enter image description here

Bunu daha az acı yapmak benim modeline ne yapabilir? Bunu bir şekilde hazırlayabilir miyim? Daha iyisi, EF ekibi bu sorunları ele alabilir mi yoksa çerçeveyi açabilir mi? Ya da en azından Warapper'un yazımını düzeltin mi?

DÜZENLEME: Bunu tetikleyen belirli bir EF çağrısı temel olarak var db = new MyDbContext(); db.Personnel.Where(a => a.Login == login).SingleOrDefault();'dur. Ayrıca bir EF Migrations Seed() AddOrUpdate etkin bir şekilde aynı yığını oluşturur. Biraz daha fazla bağlam verebilir dolgun yığın izleme, burada: Fuller Stack Trace

DÜZENLEME: Bazı ilgili bağlantılar:

EDIT2: Artık onlar sadece open sourced kodu, görünen o bu hat şu:

//Filter the 1:1 foreign key associations to the ones relating the sets used in these cell wrappers. 
oneToOneForeignKeyAssociationsForThisWrapper = 
    oneToOneForeignKeyAssociationsForThisWrapper.Where(
     it => (it.AssociationEndMembers.All(endMember => entityTypes.Contains(endMember.GetEntityType())))); 

Bazı çalışma gerektiren bir tanesidir. Muhtemelen gerekmediğinde bir O (n^2) algoritması kullanıyor, ama henüz yakından bakmadım.

EDIT3: Daha büyük modeller için yavaş olduğu bilinir öncesi Ef6'yı görünümü nesilde http://entityframework.codeplex.com/discussions/396130

+1

Bu izlemeyi oluşturan C# örneğini porovide yapabilir misiniz? –

+0

@Erik Philips: Elbette (düzenlenmiş soru) ama önemsiz. –

+2

İlk bağlantı noktası [Performansla İlgili Konular (Varlık Çerçevesi)] olmalıdır (http://msdn.microsoft.com/en-us/library/cc853327%28v=vs.110%29.aspx) zaten orada - sürüm numarasını kontrol edin btw – AakashM

cevap

22

: Mutlu, o Ef6 iş bu kodu tamir ediyor gibi görünüyor. Şimdilik çözüm önceden hazırlanmış görünümler kullanmaktır. Bu sayede tasarım zamanında görünümler oluşturursunuz ve çalışma zamanında bu çalışmadan kaçınıyorsunuz. Bunu EF güç araçlarını indirmek ve "Varlık Veri Modeli'ni Optimize Et" seçeneğini seçmek için. Projenize görünümleri içeren bir C# dosyası ekleyecektir. Aşağı tarafı, modeliniz her değiştiğinde bunu yapmanız gerekecek. Not: araçla görünümler oluşturmak için, çalışma zamanında (böylece bazen sabırlı olmanız gerekir) çalışma zamanı oluşturmak için gereken süre kadar sürer. http://blog.3d-logic.com/2013/12/14/using-pre-generated-views-without-having-to-pre-generate-views-ef6/

- Ben çok daha rahat (sadece Ef6 çalışır unutmayın) kullanmaktır farklı bir çözüm yarattı http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power-tools-ctp1-released.aspx

Edit son

: Burada yararlı olabilir EF Güç Araçları hakkında bir yazıdır

+0

Teşekkürler, buna bakacağım ve sonuçları burada göndermeyi deneyeceğim. Bu süreci hızlandırmak için gelecekteki sürümlerde yapılabilecek yazılım geliştirmeleri olduğunu mu düşünüyorsunuz, yoksa hesaplaması için çok fazla şey var mıdır ve elde edeceği kadar iyileştirilmiş mi (işlerimi genişletip çıkarmam gerektiğini ima ediyor)? –

+0

Daha iyi hale getirmenin olası yollarını arıyoruz. – Pawel

+0

Bunu duyduğuma sevindim! Şansın en iyisi ... mümkünse destek vermekten mutluluk duyarız. –

12

İşte bunu yapmanın başka bir yolu. Biraz manuel çalışma gerektirir, ancak aslında MsBuild'i kullanmak istediğiniz senaryo için daha uygun olabilir. Bunun yerine Elektrikli el aletleri ile görüş oluşturma onları el oluşturabilir (Senin için işe yaramadı üzüldük) - burada adımlar şunlardır:

  • Öncelikle bağlam için eserler almak gerekir. Tümüne ihtiyacınız var - csdl, ssdl ve msl dosyaları. Bunları almak için EdmxWriter'i kullanabilirsiniz. EdmxWriter'in üç dosyayı birleştiren bir edmx dosyası döndürdüğünü ve böylelikle bunları bölmeniz gerektiğini unutmayın.İşte bu adımın kodu (EF5'e özgü ad alanlarının olduğunu unutmayın, eğer EF5 ve .NET Framework 4.5'i kullanmayı düşünüyorsanız, bunları uygun şekilde değiştirmeniz veya yalnızca yerel isimle ve tam adı olmayan öğeleri seçmeniz gerekir):
    • Eğer EdmGen aracını kullanarak görüşlerini üretebilir eserler var
    
        var ms = new MemoryStream(); 
        using (var writer = XmlWriter.Create(ms)) 
        { 
         EdmxWriter.WriteEdmx(new Context(), writer); 
        } 
    
        ms.Position = 0; 
    
        var xDoc = XDocument.Load(ms); 
    
        var ssdl = xDoc.Descendants("{http://schemas.microsoft.com/ado/2009/02/edm/ssdl}Schema").Single(); 
        var csdl = xDoc.Descendants("{http://schemas.microsoft.com/ado/2008/09/edm}Schema").Single(); 
        var msl = xDoc.Descendants("{http://schemas.microsoft.com/ado/2008/09/mapping/cs}Mapping").Single(); 
    
        ssdl.Save("Context.ssdl"); 
        csdl.Save("Context.csdl"); 
        msl.Save("Context.msl"); 
    
    . Burada elle yaptığımızdan, VS Komut isteminden bunu yapmanız gerekir. Burada görüntüleme oluşturmak için kullandığınız komut şöyledir:
EdmGen /mode:ViewGeneration /incsdl:Context.csdl /inmsl:Context.msl /inssdl:Context.ssdl /outviews:Context.Views.cs
  • projenize oluşturulan dosya ekleyin.

Görünüm oluşturma sisteminizi derleme sistemiyle bütünleştirmek isterseniz, bir T4 şablonu kullanarak daha ilginç bir seçenek daha var. Şablon yukarıdaki adımları halledecektir. Bu yaklaşım hakkında daha fazla bilgiyi burada http://blogs.msdn.com/b/adonet/archive/2008/06/20/how-to-use-a-t4-template-for-view-generation.aspx bulabilirsiniz. Tek sorun, örnek CodeFirst yaklaşımı için değil, bu yüzden zor olmamalıdır biraz değiştirilmesi gerekiyor olmasıdır.

Aslında Kod İlk için T4 şablonları oluşturdum. Blogumda indirmek için bir bağlantı bulabilirsiniz: http://blog.3d-logic.com/2012/05/28/entity-framework-code-first-and-pre-generated-views/

Şablonlar artık Visual Studio Kod Galerisi'nde kullanılabilir. http://blog.3d-logic.com/2012/06/13/entity-framework-codefirst-view-generation-templates-on-visual-studio-code-gallery/

+0

Actaully şimdi bunu gönderdikten sonra CodeFirst için T4 şablonları oluşturmayı düşünüyorum ... Stay tuned. – Pawel

+0

Önce kod için görünüm gen T4 şablonları oluşturdum. Link benim blog yazıyorum: http://blog.3d-logic.com/2012/05/28/entity-framework-code-first-and-pre-generated-views/ – Pawel

+1

Paella'nın C# T4 şablonuna giden geçerli bağlantısı : http://visualstudiogallery.msdn.microsoft.com/ae7730ce-ddab-470f-8456-1b313cd2c44d –

1

Görünüm nesnesinin şu anki sürümünde oldukça hızlı olduğu görülmektedir. (6.1) Hazırlamada başka bir daha geniş önbellekleme çözümü var: https://entityframework.codeplex.com/workitem/1876. Bu yamanın kabul edilmesini bekleyebilir ya da yeterince cesursanız, kendiniz için uygulayabilirsiniz.

İlgili konular