Ist es möglich, das gesamte Modell "on-the-fly" (Database First) mit Entity Framework jedes Mal zu erstellen, wenn eine Verbindungszeichenfolge übergeben wird?
Ich habe Folgendes versucht:
%Vor%aber es wirft mich immer einen Fehler
In System.Web.DynamicData.dll
ist eine nicht behandelte Ausnahme vom Typ 'System.ArgumentException' aufgetretenZusätzliche Information: Der Kontexttyp 'DbContext.Model1' wird nicht unterstützt.
Weitere Informationen:
Ich habe alle erforderlichen Tabellen in der Datenbank, die ich nicht kontrollieren kann und wenn ich neue Tabellen oder Spalten in alten Tabellen brauche, dann führen die db-Typen die passenden Skripte für mich aus.
Ich versuche, eine generische DLL mit EF
zu erstellen, die ich für verschiedene Apps 6 verwenden kann, einschließlich winforms
und mvc
Web-Apps. Ich versuche herauszufinden, was wir dafür am besten können.
Kann ich codefirst
und databasefirst
miteinander mischen?
Würde nicht codefirst
Tabellen für mich generieren, die ich bereits habe?
Jede meiner Apps besteht aus 1 Winforms und 1 Web-App und sie teilen sich die Datenquelle wie z. B.
Test 1 Windows App & amp; Test 1 MVC App = DB 1
Test 2 Windows App & amp; Test 2 MVC App = DB 2
Test 3 Windows App & amp; Test 3 MVC App = DB 3
Also muss ich die connectionstring
an die DBContext
übergeben. Wie würden meine Entitäten arbeiten?
Wenn weitere Informationen erforderlich sind, lassen Sie es mich wissen.
Technisch können Sie Entitäts-Framework-Modelle zur Laufzeit erstellen, zumindest indem Sie eine Assembly im laufenden Betrieb erstellen und APIs und Attribute verwenden, die zuerst funktionieren oder erstellen benötigtes XML für Modell. Aber Sie müssen zur Laufzeit keine Modellklassen erstellen.
Tatsächlich ist das Erstellen von Modellklassen zur Laufzeit nutzlos, da Sie Modelle erstellen, die sowohl zur Kompilierungszeit als auch zur Laufzeit typisiert werden. Sie erstellen Modelle, weil Sie eine Type1
an eine Methode übergeben oder eine solche typisierte Abfrage wie .Where(x=>x.SomeFiled == SomeValue)
schreiben möchten.
Wenn Sie verschiedene Anwendungsfälle für unterschiedliche Kunden haben
Wenn Sie unterschiedliche Anwendungsfälle für verschiedene Clients haben, müssen Sie nichts Spezifisches tun. Ihre Anwendung wurde gebrauchsfertig geschrieben und verwendet nur unterschiedliche Verbindungszeichenfolgen in webconfig
und appconfig
für verschiedene Kunden.
Wenn Sie eine einzige Anwendungsinstanz für alle Kunden haben
In diesem Fall, in dem Sie eine mandantenfähige Anwendung haben, können Sie Ihrem db-Kontextkonstruktor, der die Verbindungszeichenfolge als Eingabe akzeptiert, einfach eine Überladung hinzufügen. Wenn Sie dann eine Instanz Ihres Db-Kontexts erstellen müssen, können Sie diese Überladung verwenden und den Benutzernamen, das Kennwort und den Datenbanknamen in die Verbindungszeichenfolge auf der Grundlage Ihrer Mandantenerkennungsstrategie eingeben.
%Vor% Es ist besser, die neue Überladung in eine partielle Klasse zu legen. Dann wird es nicht jedes Mal berührt, wenn Sie die Vorlage edmx
und .tt
des Kontextlaufs aktualisieren.
Sie können beispielsweise Verbindungszeichenfolge und Kontext auf diese Weise erstellen:
%Vor% Oder vielleicht möchten Sie die Windows-Authentifizierung, dann verwenden Sie statt Benutzer-ID und Passwort @"integrated security=True;" +
.
Sie können verschiedene Mandanten anhand verschiedener Strategien erkennen, einschließlich:
Sie können die Rolle des Erstellens eines geeigneten Kontexts für eine Klasse vergeben, die auf Ihrer Mandantenstrategie basiert.
Was soll ich tun, wenn sich eine Tabelle in der Datenbank ändert?
Aktualisieren Sie einfach Ihr edmx-Modell zur Entwurfszeit, erstellen Sie Ihre Anwendung neu und verteilen Sie sie neu. Wenn ein zu einer Tabelle hinzugefügtes Feld oder eine neue Tabelle zur Datenbank hinzugefügt wurde und Sie eine solche typisierte Abfrage in der Anwendung db.Tabe1.Where(x=>x.Field1==value1)
schreiben möchten, müssen Sie, wie oben erwähnt, das Modell aus der Datenbank aktualisieren und Ihre Anwendung neu erstellen. Das Regenerieren des Modells zur Laufzeit ist nicht sinnvoll.
Wie kann ich die Produktivität steigern?
Ich weiß, dass es Ihr Ziel ist, die Produktivität zu steigern, aber das Erstellen von Modellen zur Laufzeit ist nicht das, wonach Sie suchen. Stattdessen können Sie generische Datenzugriffslayer und generische Business-Logik-Layer erstellen, um die Produktivität zu erhöhen. Wenn Sie zum Beispiel viele Entitäten haben, die CRUD-Operationen benötigen, können Sie eine EntityBusiness<TContext, TModel>
-Klasse erstellen und generische void Create(TModel entity)
, IList<TModel> GetAll(object key)
, TModel GetByKey(object key)
, TModel Update(TModel entity)
, void DeleteByKey(object key)
usw. haben. Auf diese Weise kann einfach eine Instanz von EntityBusiness<SampleDbEntities, Product>
erstellen oder von ihr erben. Die Klasse enthält das gesamte Verhalten für eine einfache CRUD-Operation und Sie können sie erweitern, indem Sie Unterstützung für einige andere nützliche Fälle wie Validierungen hinzufügen. Ein Beispiel für das Erstellen eines generischen Repositorys und einer Arbeitseinheit finden Sie in Artikel in asp.net mvc Website.
Ja, Sie können die Verbindungszeichenfolge zur Laufzeit angeben.
Ja, wenn eine Tabelle geändert wird, müssen Sie die C # -Klasse aktualisieren. Wenn Sie zuerst die Datenbank verwenden, aktualisieren Sie die edmx und speichern Sie sie. Wenn Sie Code zuerst verwenden, aktualisieren Sie die C # -Klasse manuell.
Ein Beispiel.
Eine Entitätsklasse
%Vor% A DbContext
Verwendung ...
%Vor% Wenn Sie eine einzelne Anwendung haben, muss die Anwendung den minimalen Satz von Tabellen und Spalten verwenden (d. h. Entitäten und Eigenschaften).
Das Erstellen des Modells aus der Datenbank ist nutzlos, da die Anwendung nur die gemeinsamen Tabellen und Spalten verwenden muss.
In Ihrem Fall könnte ein guter Ansatz CodeFirst verwenden (in Ihrem Fall CodeFirst aus der Datenbank) und dann die Modellprüfung deaktivieren (um das Modell zu überprüfen, können Sie immer noch einen Komponententest verwenden).
Tags und Links asp.net-mvc c# entity-framework asp.net winforms