2014-03-26 2 views
7

Entity Framework erlaubt Freigabe der gleichen Entität zwischen mehreren Datenbankkontexten. Daher muss ich nur einen Datenbankkontext in einer GUI-Anwendung (sei es WPF oder WinForms) verwenden, weil Entitäten miteinander interagieren müssen.Entitätsframework + SQL Server Compact + WPF/WinForms = Langsame UI?

SQL Server Compact erlaubt nicht teilen die gleiche Datenbankverbindung zwischen mehreren Threads. Wenn ich versuche, eine Verbindung in einem Thread zu erstellen und eine SQL-Abfrage in einem anderen Thread auszuführen, stürzt meine Anwendung wahrscheinlich ab.

Daher muss ich erstellen EF Datenbank Kontext auf einem Thread und führen Sie alle Abfragen auf diesem Thread. Ich habe GUI-Thread dafür verwendet, weil fast alle Abfragen sehr schnell sind. Allerdings habe ich jetzt eine langsame Abfrage und möchte während der Ausführung eine animierte Fortschrittsleiste anzeigen.

Aber ich kann das nicht tun, denn wenn ich eine Abfrage auf einem anderen Thread ausführen, stürzt meine App mit AV. Darüber hinaus scheint sich EF zu beschweren, wenn ich mehrere Abfragen gleichzeitig ausführen, auch ohne SQL CE beteiligt. Alle Abfragen in einen anderen Thread zu verschieben und den gesamten Code mit verrückten Mengen an Async/await, Callbacks, Locks und anderen Threading-Dingen abzudecken, klingt auch gruselig, da ich den Code einfach halten möchte, wenn es möglich ist.

Frage: Wie funktioniert die korrekte Verwendung von EF-Datenbankkontexten und SQL Server Compact in einer Multithread-GUI-Anwendung? Gibt es eine Möglichkeit, einzelne Abfragen an einen anderen Thread auszulagern, ohne die gesamte Anwendung asynchron zu machen, d. H. Gibt es eine einfache Möglichkeit, dies zu tun?

+0

Aber Sie könnten einen Aufruf haben, der einen dbcontext erstellt, eine Verbindung öffnet, eine Abfrage ausführt, die Ergebnisse verarbeitet und eine Liste/einen Datensatz zurückgibt, oder? – rene

+0

@rene Es ist GUI-App. Die angeforderten Entitäten werden bearbeitet, verbundene Entitäten werden erstellt/bearbeitet, es gibt eine automatische Vervollständigung und andere Features, die für Entitäten verwendet werden. Wenn ich eine Entität von einem dbcontext bekomme und dann eine andere Entity von einem anderen dbcontext in ihre Navigationseigenschaft einfügt, wird sich EF beschweren. Diese Operationen sind zeitlich getrennt, ich weiß nicht im Voraus, welche Entitäten der Benutzer benötigt. – Athari

+0

Nach meiner Erfahrung ist die Verwendung von EF als ORM für alles andere als die einfachste GUI ein Weg zum Wahnsinn. Die Notwendigkeit, mehrere Entitäten im Speicher zu haben und mit einem Kontext verbunden zu sein, legt nahe, dass Sie Geschäftslogik mit EF machen, die genau diese Art von Problem einleitet. Erwägen Sie stattdessen, es ausschließlich als DAL zu verwenden, um CRUD-Funktionen für ein separates Objektmodell zu behandeln. – superstator

Antwort

1

SQL Server CE unterstützt Multithreading. Aber seine Objekte wie SqlCeConnection oder SqlCeTransaction sind nicht Thread-sicher. Jeder Thread sollte eine separate Verbindung verwenden. Eine Entität Framework DataContext-Instanz ist für eine Arbeitseinheit (Geschäftstransaktion) konzipiert. The recommendation ist ein Kontext für ein Formular.

Sie können Ihre Anwendung entweder neu entwerfen und Daten mit DTOs speichern/übertragen. Oder Sie können Features von Entity Framework (here oder here) anfügen/trennen. Oder kombinieren Sie beides.

+0

Ein Kontext pro Formular funktioniert nur, während Formulare einfach sind. Nehmen wir an, ich habe Suchfunktionen in der Form, die langsame Abfragen erfordert. Wenn ich die Abfrage in einen anderen Thread verschiebe, kann ich die Entitäten, die ich erhalte, nicht verwenden. Wenn ich sie abtrenne und wieder anbringe, verliere ich verbundene Einheiten, lazy loading, change tracking; Ich werde wahrscheinlich auch auf Fälle stoßen, wenn eine Entität mit derselben ID bereits angehängt ist. Wenn ich DTOs verwende und keine Kontexte speichern, sind die Ergebnisse ähnlich, aber mit mehr Code und ohne ID-Konflikte. Ich sehe keine Lösung, die große Teile der Funktionalität von EF nicht opfert. – Athari

Verwandte Themen