2010-06-03 8 views
55

Es scheint, dass das verzögerte Laden in EF4 standardmäßig aktiviert ist. Zumindest in meinem Projekt kann ich sehen, dass der Wert vonDeaktivieren Sie das verzögerte Laden standardmäßig in Entity Framework 4

standardmäßig wahr ist. Ich möchte nicht lazy laden und ich möchte nicht schreiben müssen:

dataContext.ContextOptions.LazyLoadingEnabled = false; 

jedes Mal bekomme ich einen neuen Kontext. Gibt es also eine Möglichkeit, es standardmäßig über das gesamte Projekt auszuschalten?

Antwort

63

Die folgende Antwort bezieht sich auf Datenbank-First oder Modell-First Workflow (die nur zwei Workflows, die mit Entity Framework verfügbar waren (Version < = 4,0), wenn die Frage gestellt wurde). Wenn Sie den Code-First-Workflow verwenden (der seit der EF-Version> = 4.1 verfügbar ist), fahren Sie mit der Frage answer bei dieser Frage fort, um eine korrekte Lösung zu erhalten.


Die edmx Datei hat in der <ConceptualModel> und <EntityContainer> Definition ein Attribut für verzögertes Laden, wo man faul Laden im Allgemeinen auf false gesetzt werden:

<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false"> 

Dies schafft die folgende Einstellung im Object Konstruktor:

public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext") 
{ 
    this.ContextOptions.LazyLoadingEnabled = false; 
    OnContextCreated(); 
} 

Mein Beispiel ist auf diese Weise nicht gemeint, dass die ObjectContext erzeugt (oder DbContext in neueren EF-Versionen) sollte manuell bearbeitet werden (was bei jedem Modellupdate aus der Datenbank überschrieben würde, wie ctorx darauf hinwies), aber das EntityContainer Element im edmx:ConceptualModels-Teil der EDMX-Datei sollte durch Hinzufügen des annotation:LazyLoadingEnabled="false" Attributs bearbeitet werden - entweder manuell in einem XML-Editor oder auf der Eigenschaftenseite der Designeroberfläche, auf der diese Option ebenfalls verfügbar ist. Diese Änderung der EDMX-Datei generiert automatisch die Kontextklasse mit der deaktivierten Lazy Loading-Option im Konstruktor, wie oben gezeigt. Die EDMX-Dateiänderung selbst wird nicht überschrieben, wenn das Modell von der Datenbank aktualisiert wird.

+0

Perfekt, danke. –

+15

Dazu müssen Sie den generierten Code ändern, der überschrieben wird, wenn Sie Ihr Modell ändern. Erwägen Sie, eine ObjectContextFactory an Ort und Stelle zu setzen und die Änderung in der Factory vorzunehmen. Auf diese Weise setzen Sie die Option immer noch nur einmal und Sie ändern den automatisch generierten Code nicht. – ctorx

+0

@ctorx - AFAICT eine einfachere Option als die Fabrik würde nur die partielle OnContextCreated implementieren, um Lazy Loading aus zu schalten? Oder fehlt mir etwas? –

58

Ich schrieb eine schnelle Probe, die how the new Lazy Loading features work with EF Code First zeigt. Zu erreichen, was Sie im Kodex Erstes Modell wollen, ist einfach eine Frage der eine Zeile in DbContext Konstruktor hinzufügen, etwa so:

public BlogContext() 
{ 
    this.Configuration.LazyLoadingEnabled = false; 
} 
+10

Nicht dass es viel ausmacht, aber sowohl ': base()' als auch 'this. 'sind in diesem Code redundant. –

+0

In Bezug auf die Funktionalität, ja, in Bezug auf Lesbarkeit denke ich, dass es manchmal nützlich ist, 'this' einzuschließen. Ich stimme 'base() 'zu, aber ich kann mir keinen Grund vorstellen, das hinzuzufügen. –

+0

Ja, ich bin mir nicht sicher, warum base() jemals darin war. Entfernt. – ssmith

24

Wenn Sie EF4-Code Zuerst verwenden kann, ja? Daher gibt es in der Initialisierung Ihres Kontexts die Überschreibung von 'OnModelCreated'.

In dieser Methode rief ich einfach und legen Sie die Eigenschaft und alles wurde gelöst.

protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
    base.Configuration.LazyLoadingEnabled = false; 
} 

Mein Modell ist jetzt viel schmackhafter. Lazy Loading ist großartig ... aber nicht, wenn Sie es nicht wollen. Und wenn Sie anfangen, Zirkelbezüge zu haben, ist es einfach lächerlich.

+4

Dies funktioniert nicht, da es das verzögerte Laden nur für die Kontextinstanz deaktiviert, die das Modell erstellt (normalerweise die erste verwendete Instanz nach dem Start der Anwendung). Für alle späteren Kontextinstanzen wird 'OnModelCreating' nicht aufgerufen und 'LazyLoadingEnabled' hat den Standardwert - was' true' ist. – Slauma

+0

@Slauma - Ich habe das exakt gleiche Problem heute getroffen, und ich habe diese Antwort bearbeitet (da es die akzeptierte ist), um sie stattdessen in den ctor zu ändern. Wenn ich die akzeptierte Antwort von dieser auf Ihre ändern könnte, würde ich das stattdessen tun. :) –

+1

@JamesManning: Diese Frage hat eine seltsame Geschichte. Meine Antwort wurde bis vor einigen Monaten akzeptiert. Aber meine Antwort ist nicht gut (ctorx Kritik ist sehr gültig). Dann hat der Fragesteller das Akzeptieren auf dieses verschoben, was bis zu deinem Edit einfach falsch war. Außerdem ist es eine Antwort für 'DbContext', die viel später kam, als die Frage gestellt wurde und die Codefragmente in der Frage sind immer noch für' ObjectContext'. Jetzt haben Sie es zu einer korrekten Antwort für 'DbContext' bearbeitet, aber es ist dasselbe wie die Antwort von ssmith, die mehr als ein Jahr älter ist. Aber beides ist keine Antwort für 'ObjectContext'. Ziemlich verrückt :) – Slauma

21

Sie können es auch vom Designer tun. Öffnen Sie einfach die EDMX-Datei, klicken Sie mit der rechten Maustaste auf eine beliebige Stelle des Modells und wählen Sie Eigenschaften. Setzen Sie dann LazyLoadingEnabled auf false. enter image description here

4

Wenn Sie den Code zuerst modellieren, entfernen Sie einfach das Schlüsselwort virtual in Ihren Referenz-/Objekteigenschaften. Wenn Sie virtuell auf eine Referenz zugreifen, wird LazyLoading für diese bestimmte Referenz aktiviert.

Verwandte Themen