2017-07-17 3 views
0

Dieser macht mich crasy: Ich habe ein EF-Modell auf einer Datenbank, die eine Tabelle mit dem Namen Kategorie mit 6 Zeilen enthält. Ich möchte dies in einer Dropdown-Liste in WPF anzeigen, also muss ich es an die Categories.Local Observable-Auflistung binden. Das Problem ist, dass diese beobachtbare Sammlung niemals den Inhalt der Datenbanktabelle erhält. Mein Verständnis ist, dass die Sammlung synchron mit der Datenbank erhalten soll, wenn eine Abfrage oder Speicher von Daten mit SaveChanges() Durchführung So lief ich die followin 2 Tests:in Entity Framework, bleibt DbSet.Local nicht synchron

Categories = _db.Categories.Local; 

    // test 1 
    Debug.WriteLine(_db.Categories.Count()); 
    Debug.WriteLine(_db.Categories.Local.Count()); 

    // test 2 
    _categories.Add(new Category() { CategoryName = "test" }); 
    _db.SaveChanges(); 
    Debug.WriteLine(_db.Categories.Count()); 
    Debug.WriteLine(_db.Categories.Local.Count()); 
    Debug.WriteLine(_categories.Count()); 

Der Test 1 zeigt 6 Zeilen in der Datenbank, und 0 in lokal. Der Test 2 zeigt 7 Zeilen in der Datenbank, und 1 in lokalen (beiden Versionen)

I atempted auch _db.Category.Load() zu verwenden, aber wie erwartet, es funktioniert nicht, weil es db erstes ist, nicht in ersten Code.

Ich ging auch durch diese Seite https://msdn.microsoft.com/en-us/library/jj574514(v=vs.113).aspx, erstellte eine objektbasierte Datenquelle und verknüpfte mein Kombinationsfeld, ohne Erfolg.

Weiß jemand, was ich falsch mache? Vielen Dank im Voraus für Ihre Hilfe.

+0

Warum denkst du '_db.Category.Load();' funktioniert nicht? Es ist nicht Code zuerst spezifisch. Beachten Sie, dass '_db.Categories.Count()' in eine SQL-Abfrage übersetzt und nichts in den Kontext lädt. –

+0

Ich tippte '_db.Category.Load();' es und es sagt, dass die Methode unbekannt ist. Hast du versucht? Ich stimme zu, dass 'Count()' die Aufgabe möglicherweise nicht erledigt, aber ich verstehe nicht, wie ich nach dem Hinzufügen eines Elements und dem Speichern von Änderungen zu einer Zählung von 1 kommen kann, während sich 7 Zeilen in der Datenbank befinden. –

+0

Es ist eine benutzerdefinierte Erweiterungsmethode. 'using System.Data.Entity;' sollte Ihnen Zugriff darauf geben (sowie viele andere innerhalb der 'QueryableExtensions' Klasse). 'Load' ist grundsätzlich' ToList' ohne eine Liste zu erstellen (nur um 'DbSet.Local' zu füllen). –

Antwort

1

Die DbSet<T> Klasse ist IQueryable<T>, daher DbSet<T>.Count() Verfahren Karten Queryable.Count<T> Erweiterungsmethode, die wiederum zu SQL-Abfrage übersetzt und gibt die Anzahl der Datensätze in der Datenbank-Tabelle ohne alles in db Kontext lokale Cache geladen werden.

Während gibt Ihnen einfach Zugriff auf den lokalen Cache. Sie enthält die Entitäten, die Sie hinzugefügt haben, sowie die Entitäten, die von der Abfrage geladen werden und T Instanzen zurückgeben (oder andere Entitäten, die auf T über die Navigationseigenschaft verweisen). Um den lokalen Cache vollständig geladen (Auffüllen), müssen Sie Load nennen:

_db.Categories.Load(); 

Die Load ist eine benutzerdefinierte Erweiterungsmethode in QueryableExtensions Klasse definiert, so dass Sie

using System.Data.Entity; 

enthalten müssen Um Zugriff darauf zu erhalten (sowie die eingegebenen Include, XyzAsync und viele andere EF-Erweiterungsmethoden). Die Methode Load ist äquivalent zu ToList, aber ohne zusätzlichen Aufwand zum Erstellen zusätzlicher Listen.

Sobald Sie das tun, wird die Bindung funktionieren. Bitte beachten Sie, dass die Local nicht die Änderungen widerspiegelt, die an der Datenbank durch verschiedene DbContext Instanzen oder verschiedene Anwendungen/Benutzer vorgenommen wurden.