Abfragen von Daten mit Entity Framework von dynamisch erstellten Tabellen

8

TLDR; Wie lese ich Daten aus einer Tabelle mit Entity Framework, wenn der Tabellenname zur Kompilierzeit nicht bekannt ist?

Es gibt ein externes System, das einen Großteil der Informationen verarbeitet und anschließend für jeden Stapellauf eine neue Tabelle erstellt und einige Daten in dieser Tabelle speichert. Das Spaltenlayout dieser neuen Tabellen ist bereits bekannt, daher habe ich ein ADO.NET-Entitätsdatenmodell (edmx-Datei) aus einer vorhandenen Datenbank generiert, wo es eine Tabelle mit genau derselben Spalte gibt Layout.

Die ursprüngliche Tabelle in dieser Datenbank heißt ResultTableTemplate , daher heißt die Entitätsklasse, die diese Tabelle darstellt, auch ResultTableTemplate .

Ich versuche herauszufinden, wie ich mein ADO.NET-Entitätsdatenmodell verwenden kann, um aus diesen dynamisch erstellten Tabellen zu lesen und IEnumerable<ResultTableTemplate> zurück zu bekommen. Was ich bisher gemacht habe, ist folgendes:

%Vor%

Wenn ich die Abfrage ausführe, erhalte ich System.Data.EntitySqlException mit der folgenden Nachricht:

  

'ResultTable419828' konnte im aktuellen Bereich oder nicht aufgelöst werden   Kontext. Stellen Sie sicher, dass alle referenzierten Variablen im Gültigkeitsbereich sind   erforderliche Schemas werden geladen, und auf diese Namespaces wird verwiesen   korrekt. Beinahe Mitgliedzugriffsausdruck, Zeile 1, Spalte 225.

ResultTable419828 ist der Wert von tableName

Ich habe versucht tableName + " AS ResultTableTemplate" , aber es hat nicht geholfen.

Gibt es einen Weg für mich, oder muss ich das ohne die Hilfe von Entity Framework machen?

BEARBEITEN: Mir ist jetzt klar, dass der Abfragetext, den ich schreibe, nicht vollständig an die zugrunde liegende SQL Server-Instanz übergeben wird, sondern von Entity Framework interpretiert wird, das eine ObjectQuery<ResultTableTemplate> -Instanz zurückgibt. Es sucht also nach ResultTable419828 unter den automatisch generierten DbSet Instanzen des Contexts.

Dennoch, gibt es einen Weg für mich, um zu erreichen, was ich tun muss?

BEARBEITEN: Danke Ladislav Mrnka . Jetzt mache ich das:

%Vor%     
Anders Tornblad 17.01.2012, 15:00
quelle

2 Antworten

11

Es ist nicht direkt möglich. Wenn Sie die Entity auf ResultTableTemplate abbilden, codieren Sie den Namen der Tabelle für diese Entität fest. Entitäten können nur einmal (pro Modell) zugeordnet werden. Daher führt jede EF-Abfrage für diese Entität zur Laufzeit immer zur Abfrage in ResultTableTemplate table.

Die einzige Möglichkeit zum Ändern ist das Ändern der Zuordnungsdatei (SSDL) zur Laufzeit, was ziemlich hässlich ist, da Sie die XML-Datei ändern und neu laden müssen. Sie müssen MetadataWorkspace jedes Mal manuell erstellen, wenn Sie die Datei ändern. Das Erstellen von MetadataWorkspace ist einer der leistungsintensivsten Vorgänge in EF. Im normalen Lauf wird MetadataWorkspace nur einmal pro Anwendungslauf erstellt.

Es gibt eine einfache Problemumgehung. Sie kennen den Tabellennamen und kennen die Tabellenstruktur - sie ist behoben. Verwenden Sie also direktes SQL und verwenden Sie EF, um das Ergebnis in Ihrer zugeordneten Entitätsklasse zu materialisieren:

%Vor%

Der Nachteil ist, dass Sie Linq bei diesem Ansatz nicht verwenden können, aber Ihre Anforderung ist nicht sehr gut für EF geeignet.

    
Ladislav Mrnka 17.01.2012, 15:22
quelle
0

Versuchen Sie das; :)

%Vor%     
Muru Bakthavachalam 21.03.2014 00:03
quelle

Tags und Links