2009-06-23 3 views
21

Entity Framework ist lähmend langsam, so dass ich versuchte mit einer gespeicherten Prozedur, aber ich lief auf dieses Problem.Verwenden Sie eine gespeicherte Prozedur im Entitätsframework. Wie erhalte ich die Entity, deren Navigationseigenschaften befüllt werden?

Entity Framework ermöglicht es Ihnen, eine gespeicherte Prozedur zu definieren, die eine Entität erzeugt. Meine Entität hat jedoch Navigationseigenschaften, die bei Verwendung dieser Methode nicht gefüllt werden.

Gibt es eine Arbeit?

+1

Vielleicht könnten Sie uns ein paar Beispiele geben, was Sie mit EF machen, das "lähmend langsam" ist? Ich habe EF in den meisten Fällen nicht merklich langsamer gefunden, es sei denn, ich mache etwas, das es ineffizient macht. –

Antwort

19

Gut gespeicherte Prozeduren sind nicht zusammensetzbar. Es gibt also keine Möglichkeit, den SPROC aufzurufen und die EF in der gleichen Abfrage automatisch mit Include() oder ähnlichen Elementen zu füllen.

So sagen, Sie haben Produkte und Kategorien

und Sie haben eine sproc Produkte zu erhalten:

heißt

var products = context.GetProducts(someproductfilter); 

die resultierenden Produkte nicht ihre Kategorien geladen haben.

jedoch, wenn Sie eine zweite gespeicherte Prozedur, die die Kategorien für die Produkte bekommt:

dh

var categories = context.GetCategoriesForProducts(someproductfilter); 

ein Merkmal in EF Beziehung Fixup genannt, die verbundenen Unternehmen verbindet, sobald die zweite Einheit tritt die Kontext, wird sichergestellt, dass, nachdem beide Anrufe getätigt wurden, jedes Produkt in Produkten eine Nicht-Null-Kategorie haben wird.

Dies ist nicht ideal, weil Sie mehr als eine Abfrage ausführen, aber es wird funktionieren. Eine Alternative ist die Verwendung EFExtensions. Der Typ, der das geschrieben hat, hat die Fähigkeit geschaffen, Sprocs zu schreiben, die mehr Daten auf einmal laden.

this helps

Prost Alex

+0

Ist diese Antwort aktuell?- Ich suche genau das gleiche wie OP. –

+0

@KristianNissen hast du jemals herausgefunden, ob es einen besseren Weg gibt? War 5 Jahre so hoffentlich hat EF6 eine Lösung. – Todilo

4

ich diese Frage SO gefunden, wenn Stored Procedures (SPs) mit EF zu erforschen. Ich sehe auch Leute wie @KristianNissen und @Todilo haben gefragt, ob es ein Update mit EF6 gibt.

Die Antwort ist ja, EF 6 hat Dinge geändert, aber es hat nichts hinzugefügt, um Navigationseigenschaften beim Verwenden von SPs zu laden. Sie können auch nicht die .Include() - Methode mit SPs verwenden, wie in dieser SO question gefordert.

Die einzige Möglichkeit besteht darin, Ihren SP zu schreiben, um die Navigationseigenschaften spezifisch zu laden. Allerdings gibt es jetzt einige gute Microsoft-Dokumentation zur Verwendung von SPs - siehe Query SP und SP returning multiple result sets.

Der Vollständigkeit halber sollte die Änderung, die EF Version 6 einführte, Stored Procedures (SPs) ermöglichen, Einfüge-, Aktualisierungs- und Löschoperationen durchzuführen - siehe Microsoft article und Entity Framework Tutotial.

+0

danke für den Kommentar – user48545