web-dev-qa-db-ger.com

Platz zum Platzieren von Database.SetInitializer

Ich arbeite an einem Projekt, das mit mehreren Versionen/Varianten der Benutzeroberfläche enden kann, aber bisher habe ich zwei Unterprojekte in meiner Lösung, die Webinterface mit ASP.NET MVC enthält. Serviceprojekt ist ein Ort, an dem ich meinen Datenbankkontext und meine Modelle definiert habe. 

Mein Ziel ist es, in meinem Webprojekt mindestens oder möglicherweise keine Verweise auf EF-spezifischen Code zu haben. Ich möchte, dass es unabhängig ist. Wenn ich also die DLLs mit dem Service-Backend (z. B. SQL zu XML oder MySQL) umstelle, sollte ich in meinem MVC-Projekt nicht mehrere Änderungen vornehmen. 

So sieht es aus:

Project layout

Meine Fragen sind: - Bisher habe ich kein anderes Beispiel für die Verwendung von Database.SetInitializer als Global.asax gefunden. Ich würde gerne eine Datenbankneugestaltung vornehmen, wenn das Modell in meiner werksähnlichen DatabaseContextProvider-Klasse oder in einer Serviceklasse geändert wurde, die Daten aus dem Kontext herauszieht und der Benutzeroberfläche mit DTOs zur Verfügung stellt. Gibt es irgendwelche Nachteile dieses Ortes? - Ich möchte, dass der connectionString des Kontextes mit der Datei Properties/Settings.settings konfiguriert werden kann - ist das sinnvoll?

31
torm

Sie benötigen einen Mechanismus, um die Database.SetInitializer-Methode vor der allerersten Verwendung der DbContext aufzurufen. Deshalb wird es normalerweise in der Global.asax-Datei aufgerufen.

Sie können eine Klasse mit einer Initialisierungsmethode in Ihrem tm.Service-Projekt erstellen und sie in der Application_Start-Methode aufrufen und den Database.SetInitializer in diese Initialisierungsmethode einfügen.

Sie können die Verbindungszeichenfolge aus einer Einstellungsdatei angeben.

14
Eranga

Um die Kopplung zu vermeiden, würde ich es vorziehen, den Initialisierer nicht außerhalb der Assembly zu setzen, die den DataContext enthält. Also habe ich einen statischen Konstruktor für den DataContext hinzugefügt. Auf diese Weise genießt jedes Projekt, das auf diese Assembly verweist, den Initialisierer, ohne es explizit festzulegen, und der Initialisierer wird nur einmal pro Prozess festgelegt.

static MyDataContext()
{
   Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDataContext, Configuration>());
}

Die Verbindungszeichenfolge wird natürlich aus der Konfigurationsdatei der Anwendung übernommen.

36
RonyK

Ich habe es auf den DbContext-Konstruktor gesetzt und arbeitet für mich.

public myDbContext() : base(connectionToDatabase) {
        Database.SetInitializer<myDbContext>(null);
    }

Die Lösung oben wird funktionieren, ist jedoch nicht so effizient wie der folgende Code:

  protected void Application_Start()
    {
        Database.SetInitializer<myDbContext>(null);
    }

In meinem Fall habe ich keinen Verweis auf meine DAL in der Benutzeroberfläche, und aus diesem Grund erstelle ich eine EntityFramework-Konfiguration und registriere meine Einstellung mit Reflection.

 protected void Application_Start()
    {           
        EntityFrameworkConfig.RegisterSettings();
    }


 public static class EntityFrameworkConfig
{
    public static void RegisterSettings()
    {
        // Use the file name to load the Assembly into the current
        // application domain.
        Assembly a = Assembly.Load("MyAssembly");
        // Get the type to use.
        Type myType = a.GetType("MyType");
        // Get the method to call.
        MethodInfo myMethod = myType.GetMethod("MySettingsMethod");
        // Create an instance.
        object obj = Activator.CreateInstance(MyType);
        // Execute the method.
        myMethod.Invoke(obj, null);
    }
}

  public void Configurations()
    {
      //Other settings
        Database.SetInitializer<myDbContext>(null);
    }

Aktualisierte

Mit Entity Framework 6 können Sie jetzt den NullDatabaseInitializer verwenden

Database.SetInitializer(new NullDatabaseInitializer<MyDbContext>());
9
Ricardo Huertas

Microsoft hat es ermöglicht, ab EF6 einen Initialisierer pro Datenbankkontext in der Konfigurationsdatei der Anwendung zu konfigurieren. Siehe den letzten Abschnitt auf dieser Microsoft-Seite: https://msdn.Microsoft.com/en-us/data/jj556606.aspx

Dies hat wie der "Global.asax" -Ansatz den Vorteil, dass z. Gerätetestprojekte können einen anderen Initialisierer für denselben Datenbankkontext verwenden.

3

Klicken Sie auf die Seite Global.asax. Dort finden Sie eine Application_Start () -Methode. Neben dieser Methode hinter dem folgenden Code. Um diesen Code zu unterstützen, verwenden Sie den Namespace mithilfe von System.Data.Entity.

Database.SetInitializer<namespace.modelclass>(null);
0
user9542003