2017-07-03 2 views
1

Ich habe Probleme damit zu verstehen, wie Entity Framework Entitätsbeziehungen für In-Memory-Entitäten verbindet.Entity Framework stellt die Beziehung automatisch ein, obwohl Proxies deaktiviert sind

mit dem Entity Framework abzufragen ich Proxy-Erstellung und verzögertes Laden deaktivieren:

public static CoreContext GetReadCoreContext() 
{ 
    var context = GetCoreContext(); 
    context.Configuration.ProxyCreationEnabled = false; 
    context.Configuration.LazyLoadingEnabled = false; 
    return context; 
} 

Da ich einige geerbt Typen im ER-Modell haben, und ich möchte nur einige Einheiten enthalten, wenn die geerbte Typ ein spezifisch ist Eins, ich muss zwei getrennte Abfragen durchführen. Nur ein bestimmter Typ enthält eine Beziehung zur Lokalisierung. Bitte nicht, dass dies nur zur Veranschaulichung ist warum Ich habe zwei separate Abfragen zu tun und ist nicht unbedingt mit meiner Kämpfe zu Entity Framework Mechanismus zu verstehen.

Zunächst Abfrage ich den allgemeinen Teil, der von der spezifischen Art nicht abhängig ist:

var myGuid = Guid.Parse("6a81de0b-ce4b-44dc-a693-ca4e13e7d2ab"); 

using (var ctx = ContextFactory.GetReadCoreContext(TenantId)) 
{ 
    var entitiesQuery = ctx.MyEntity 
     .Include(i => i.EntityA) 
     .Include(i => i.GeneralType); 

    var myEntity = entitiesQuery.FirstOrDefault(e => e.Id == myGuid); 

    // check if myEntity.GeneralType is of the specialized type then query depending on the properties of this type 

    var specificEntity = myEntity.GeneralType as SpecificType; 
    if (specificEntity != null) 
    { 
     var myLocalization = ctx.Localizations.Where(l => l.Id == specificEntity.LocalizationId) 

     // Entity Framework is automatically setting myEntity.Localization to myLocalization 
    } 
} 

Was ich nicht verstehe ist, wie funktioniert Entity Framework anhängen/die Beziehung für die In-Memory-Objekt festgelegt . Beachten Sie, dass das speicherinterne Objekt kein Proxy ist - sonst würde ich verstehen, warum das funktioniert.

Wenn ich .AsNoTracking() verwende, funktioniert das oben beschriebene Verhalten nicht.

+1

finden Ich denke, dass Sie die Bedeutung von Lazy Loading fehlinterpretieren. Das Deaktivieren bedeutet, dass EF beim Zugriff auf eine Navigationseigenschaft, die sich nicht im Kontext befindet (dh nicht mit einem "Include" geladen oder explizit mit einer Abfrage abgerufen wurde), keine zusätzlichen automatischen Fahrten zur Datenbank durchführt. Wenn sich die Entität in dieser Navigationseigenschaft jedoch bereits im Kontext befindet (weil sie zuvor abgefragt und an den Kontext angehängt wurde), werden Sie sie sehen, da EF die Beziehungen zwischen den Entitäten kennt und eine Navigationseigenschaft nur eine Referenz darstellt zu einer Entität in dem Kontext. – Diana

+0

Und über Proxies müssen sie aktiviert sein, wenn Lazy Loading aktiviert ist, , aber es gibt einige Szenarien, in denen Sie Proxies aktivieren und Lazy Loading deaktivieren. Proxies beziehen sich auf die Verfolgung von Entitätszuständen. [Hier] (https://stackoverflow.com/questions/25720006/ef-6-1-difference-between-proxycreationenabled- and-lazyloadingenabled) finden Sie eine Erklärung zum Kombinieren der Werte von 'ProxyCreationEnabled' und' LazyLoadingEnabled'. – Diana

+0

Vielleicht möchten Sie Ihren Kommentar als Antwort posten, damit ich es als Lösung markieren kann. Hat mir wirklich bei meinem Verständnisproblem geholfen. – officer

Antwort

2

Ich denke, dass Sie die Bedeutung von Lazy Loading falsch interpretieren. Das Deaktivieren bedeutet, dass EF nicht automatisch zusätzliche Fahrten zur Datenbank ausführt, wenn Sie auf eine Navigationseigenschaft zugreifen, die nicht im Kontext ist (weil sie nicht eifrig mit einer Include geladen wurde oder explizit mit einer Abfrage abgerufen wurde). Wenn sich die Entität in dieser Navigationseigenschaft jedoch bereits im Kontext befindet (weil sie zuvor abgefragt und an den Kontext angehängt wurde), werden Sie sie sehen, da EF die Beziehungen zwischen den Entitäten kennt und eine Navigationseigenschaft nur eine Referenz darstellt zu einer Entität in dem Kontext.

Und über Proxies müssen sie aktiviert werden, wenn Lazy Loading aktiviert ist, aber es gibt einige Szenarien, in denen Sie Proxies aktivieren und Lazy Loading deaktivieren. Proxies beziehen sich auf die Verfolgung von Entitätszuständen. Here Sie können eine Erklärung der Kombinationswerte von ProxyCreationEnabled und LazyLoadingEnabled

+0

Beachten Sie auch, dass diese "relation fix-up" eine Funktion des EF Change Tracker ist. Wenn Sie die Änderungsverfolgung für eine Abfrage deaktivieren, wird dieses Verhalten deaktiviert. –

Verwandte Themen