Modell im laufenden Betrieb erstellen

8

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' aufgetreten      

Zusä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.

    
Code 21.06.2016, 13:02
quelle

3 Antworten

4

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:

  • URL der Anwendung (Domäne und Unterdomäne)
  • Abfragezeichenfolge oder Routenwerte
  • Benutzername

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.

    
Reza Aghaei 28.06.2016, 14:37
quelle
0

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

%Vor%

Verwendung ...

%Vor%     
Maarten 27.06.2016 09:30
quelle
0

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).

    
bubi 04.07.2016 07:16
quelle