2017-05-02 4 views
0

Ich poste diesen Thread, weil ich keine einfache Möglichkeit gefunden habe, meine db-Anfragen wie LinQ zu abstrahieren, wodurch mein Programm geändert werden kann dynamisch die Datenbank, Tabellen oder Felder erstellen.Wie DBMS-Anfragen in einem .NET-Programm abgezogen werden, während Datenbank zur Laufzeit geändert werden kann

Ich verwende .NET Framework 4.0 und SQL Server 2012, unter Windows. Ich habe eine Menge Themen zu ORMs wie Entity Framework gesehen, die es erlauben, Migrationen auf der Datenbank zur Laufzeit auszuführen, nur sie können nicht zur Laufzeit generiert werden.

Zur Zeit erstellt mein Projekt Tabelle zur Laufzeit durch Ausführen von hartcodierten SQL Server-Skripten. Nur, ich möchte nicht speziell SQLServer verwenden, ich möchte eine generische Sprache verwenden, die ein Skript für die richtige DBMS nach meinem C# -Code generiert.


Beispiel: Ich möchte, dass meine Daten Design zur Laufzeit verändern, weil mein Programm tatsächlich auf mehreren Rechnern laufen, die ihre eigene Datenbank haben. Wenn ich das Programm aktualisiere, möchte ich, dass es neue Tabellen erstellt, die von den neuen Funktionen verwendet werden.

Sagen wir, ich füge ... ein QCM für den Benutzer hinzu. Ich habe eine Winform, die es dem Benutzer ermöglicht, die Fragen zu sehen und zu beantworten. Jetzt, um die Antworten zu verfolgen, möchte ich, dass mein Programm mit Linq eine neue Tabelle erstellt und sie dann mit den Antworten füllt. Wenn ich gut verstehen, wenn Entity Framework mit dem Code ersten Ansatz: Ich würde die Paket-Manager-Konsole hinzufügen Migrationen auf jedem Rechner benutzen muß, vor der Ausführung:

var migrator = new DbMigrator(configuration); 
migrator.Update(); 

Oder ist es eine Möglichkeit, senden eine Migrationsdatei, die mit migrator.Update() aktualisiert wird; ?

+0

Also, Sie haben Code, der für SQL Server funktioniert, aber es für jede allgemeine Datenbank zu erweitern möchten? –

+1

LINQ abstrahiert Datenbankanforderungen nicht, es ist der zugrunde liegende ** ORM **, der dies tut. Ob LINQ to SQL oder LINQ to EF, es ist das ORM, das die Abstraktion bereitstellt. Was meinst du "zur Laufzeit generiert"? Code-first-ORMs wie EF, * do * generieren oder aktualisieren die Datenbank zur Laufzeit –

+0

Wie für das Targeting verschiedener Datenbankprodukte, das ist eines der Schlüsselmerkmale aller ** ORMs **. Wenn Sie ein anderes Produkt auswählen, müssen Sie in der Regel eine neue Verbindungszeichenfolge und einen neuen Provider angeben.Der Anbieter kümmert sich um die Erstellung von SQL-Skripten, die für jedes Produkt geeignet sind. –

Antwort

0

Es klingt wie Sie etwas tun möchten, das nicht gut für EF (oder praktisch jedes ORM für die Angelegenheit) ist. ORMs sind im Allgemeinen so ausgelegt, dass sie ein statisches Datenmodell einem statischen Objektmodell zuordnen.

Während es nicht unmöglich ist, zu tun, was Sie wollen, würde es ein sehr tiefes Verständnis von EF und seiner Implementierungsdetails erfordern, um die Funktionen auf unterer Ebene sowie Dynamic Linq zu verwenden. Dann müssten Sie dies dynamischen C# -Objekten zuordnen, die sich zur Laufzeit ändern können.

Ehrlich gesagt, ist es wahrscheinlich besser, eine benutzerdefinierte Datenschicht mit Standard-SQLCommand-Anweisungen selbst zu schreiben.

Soweit Migrationen gehen, ist dies in der Regel ein Entwicklungs-/Bereitstellungstool, kein Laufzeittool.

+0

Danke für diese Antwort Ich denke, es ist sehr wahr – Elekk

0

Die SqlCommand-Klasse in .net ermöglicht den direkten Zugriff auf die Datenbank, einschließlich der Ausführung beliebiger Skripte. Dadurch können Sie ein beliebiges gültiges Datenbankanweisungsskript an die Datenbank senden, einschließlich Schemadefinitionsskripts. Dadurch können Sie Datenbanken erstellen, definieren, sichern, wiederherstellen und löschen.

+0

Und alle ORMs, die am Ende einen DbCommand verwenden. Dies beantwortet nicht die (zugegebenermaßen unklare) Frage –

+0

Es würde dem OP ermöglichen, die Anforderung zu erfüllen, sein Schema zur Laufzeit zu definieren. Was die Ebene der Abstraktion anbetrifft - ich würde pedent sein und argumentieren, dass SQL DDL sowieso eine abstrakte Sprache ist :-) – PhillipH

+0

Sie haben den Punkt verpasst. Was ist die tatsächliche Antwort? Jeder ORM verwendet ADO.NET. Ein ORM * generiert * eine Abfrage und führt sie mit SqlCommand oder DbCommand aus. Es erzeugt auch * Migrationsskripte –

Verwandte Themen