Entity Framework 7 Migrationsgerüst in der Klassenbibliothek mit Konfiguration

asp.net-core code-first-migrations dnx entity-framework-core visual-studio-2015

Frage

Versuchen, Migrationen zu einem EF7-Modell hinzuzufügen, das in einer ASP.NET 5-Klassenbibliothek enthalten ist. Beim Ausführen von dnx . ef migration add mymigration schlägt mit unterschiedlichen Ergebnissen fehl, abhängig davon, auf welchem ​​Projekt ich es ausführe.

Wenn ich es im Ordner des Hauptprojekts DbContext , kann es keinen DbContext , das macht Sinn, weil der DbContext im freigegebenen Projekt ist und ef-Befehle wahrscheinlich keine Abhängigkeiten haben.

Wenn ich es im Ordner des freigegebenen Projekts ausführe, hat es keinen Zugriff auf die in startup.cs angegebene Verbindungszeichenfolge. Ich habe von Fragen wie nachgelesen dies , dass es Arbeit aus dem gemeinsamen Projekt funktioniert , wenn Sie die Verbindungszeichenfolge in der angeben OnConfiguring Methode des DbContext aber ich mag wirklich aus der Konfiguration diesen Code getrennt halten.

Ich kam in einigen Problem - Protokolle im EF7 Repository, aus denen sie Kommandozeilenoptionen implementiert ein Projekt und einen Kontext für die Angabe , aber es gibt keine Beispiele , und ich konnte nicht herausfinden , wie es zu benutzen in der Commit - Geschichte auf den Quellcode suchen .

Akzeptierte Antwort

Hier ist ein Ansatz, der für Sie arbeiten könnte.

Wenn ich es im Ordner des freigegebenen Projekts ausführe, hat es keinen Zugriff auf die in startup.cs angegebene Verbindungszeichenfolge.

Startup.cs

Ich nehme an, dass Sie in Ihrer Startup.cs die Verbindungszeichenfolge angeben, indem Sie auf Configuration zugreifen, anstatt es hart zu codieren. Außerdem nehme ich an, dass Sie im Konstruktor Ihrer Startup.cs-Datei die Konfiguration aus ein paar Quellen einrichten. Mit anderen Worten, Ihr Startup.cs könnte etwa so aussehen:

public class Startup
{
    public IConfiguration Config { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var config = new Configuration()
            .AddJsonFile("config.json")
            .AddUserSecrets()
            .AddEnvironmentVariables();

        Config = config;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<MyDbContext>(options =>
            {
                options.UseSqlServer(Config["ConnectionStrings:MyDbContext"]);
            });
    }

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        var db = serviceProvider.GetRequiredService<MyDbContext>();
        db.Database.AsSqlServer().EnsureCreated();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

config.json

Außerdem gehe ich davon aus, dass Sie die Verbindungszeichenfolge zu einer config.json im Stammverzeichnis Ihres Projekts hinzufügen (oder dass Sie sie über Benutzergeheimnisse oder Umgebungsvariablen hinzufügen). Ihre config.json könnte etwa so aussehen:

{
  "ConnectionStrings": {
    "MyDbContext": "Some-Connection-String"
  }
}

Wenn Sie es nicht so machen, könnte es sich lohnen, es zu versuchen.

Ich habe aus solchen Fragen gelernt, dass es aus dem freigegebenen Projekt funktioniert, wenn Sie die Verbindungszeichenfolge in der OnConfiguring-Methode des DbContext angeben, aber ich möchte diesen Code wirklich von der Konfiguration getrennt halten.

DbContext

Wenn meine obigen Annahmen richtig sind, können Sie auf die Verbindungszeichenfolge im DbContext indem Sie dasselbe Muster verwenden, das Sie in der Startup Klasse verwendet haben. DbContext im DbContext Konstruktor die IConfiguration . Dann OnConfiguring in OnConfiguring auf die Verbindungszeichenfolge zu. Es könnte in etwa so aussehen:

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<SomeModel>().Key(e => e.Id);
        base.OnModelCreating(builder);
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connString = Config["ConnectionStrings:MyDbContext"];
        optionsBuilder.UseSqlServer(connString);
    }

    public IConfiguration Config { get; set; }

    public MyDbContext()
    {
        var config = new Configuration()
            .AddJsonFile("config.json")
            .AddEnvironmentVariables();

        Config = config;
    }
}

Projektstruktur

Sie müssen natürlich auch eine config.json-Datei im Stammverzeichnis Ihres freigegebenen Projektordners haben. Die Struktur Ihrer Projekte könnte also so aussehen:

SharedDataContext
    Migrations
    config.json
    project.json

WebApp
    config.json
    project.json
    Startup.cs

Oben enthalten beide config.json-Dateien eine Verbindungszeichenfolgeneinstellung für den DbContext .

Einige Gedanken

Wenn Sie die Verbindungszeichenfolge config.json nicht duplizieren möchten, können Sie stattdessen Umgebungsvariablen oder Benutzergeheimnisse verwenden.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum