Entity Framework Core-Verbindungszeichenfolge - Umgebungsvariable

asp.net asp.net-core c# entity-framework entity-framework-core

Frage

Ich habe eine .net-Core-App mit Entity-Framework-Core. Wenn ich Entitäts-Framework-Migrationen oder Updates über die Befehlszeile ausführe, bekomme ich einen "Wert kann nicht null sein. Parametername: connectionString"

Die Verbindungszeichenfolge wird als Umgebungsvariable beibehalten:

ConnectionStrings__SomeContextConnection  ...(localdb)\\MSSQLLocalDB...

Wenn ich jedoch genau diese Verbindungszeichenfolge in eine .json-Konfigurationsdatei verschiebe:

"ConnectionStrings": {  
    "SomeContextConnection": "...(localdb)\\MSSQLLocalDB..." 
}

Dann erkennen die Entity-Framework-Tools die Verbindungszeichenfolge ohne Problem. Beim Debuggen des Codes in Startup.cs:

var connectionString = _config.GetConnectionString("SomeContextConnection");

Die connectionString-Variable wird auf die richtige Zeichenfolge festgelegt, wenn die Zeichenfolge an einem der beiden Speicherorte gespeichert wird. Sie stürzt jedoch ab, wenn Sie versuchen, eine Verbindung zur Datenbank herzustellen, wenn Sie die Umgebungsvariable verwenden.

(Hinweis: Im Fall der Umgebungsvariablen wird die Verbindungszeichenfolge mit Escapezeichen versehen, sodass sie von

(localdb)\\MSSQLLocalDB...

zu

(localdb)\\\\MSSQLLocalDB...

aber das Problem besteht auch nach dem Entfernen der zusätzlichen Back-Schrägstriche)

UPDATE: Wenn die Verbindungszeichenfolge in eine Windows-Umgebungsvariable verschoben wird, funktioniert es einwandfrei. Scheint nur ein Problem bei der Verwendung von Visual Studio-Umgebungsvariablen zu sein.

Beliebte Antwort

Ich empfehle Ihnen, eine DesignTimeContextFactory- Klasse für die Migrationen zu verwenden:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyContext>
{
    AmpContext IDesignTimeDbContextFactory<MyContext>.CreateDbContext(string[] args)
    {
        var connectionString = ConfigHelper.GetConnectionString();

        var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
        optionsBuilder.UseSqlServer(connectionString);

        return new AmpContext(optionsBuilder.Options);
    }
}

Der GetConnectionstring ist für mich so und ich verwende ihn in meiner Anwendung (dh für mein Web-API-Projekt und für Integrationstests):

public class ConfigHelper
{
    /// <summary>
    /// Gets the connectionstring from the appsettings.databasestring.json file in the solution root if there is no environment variable to be found
    /// </summary>
    /// <param name="solutionBasePath">Optional to not auto resolve the solution base path</param>
    /// <returns></returns>
    public static string GetConnectionString(string solutionBasePath = null)
    {
       //how to set it on IIS on the server: https://stackoverflow.com/a/36836533/1343595
        var environmentString = Environment.GetEnvironmentVariable("CUSTOMCONNSTR_MyContextDb");

        if (!string.IsNullOrEmpty(environmentString))
            return environmentString;

        if(!string.IsNullOrEmpty(solutionBasePath))
            return GetStringFromConfig(Path.Combine(solutionBasePath, "appsettings.databasestring.json"));

        var filePath = Path.Combine(GetSolutionBasePath(), "appsettings.databasestring.json");

        return GetStringFromConfig(filePath);
    }

    private static string GetStringFromConfig(string filePath)
    {
        IConfigurationRoot config = new ConfigurationBuilder()
            .AddJsonFile(filePath) //you can change the value of the connectionstring in the appsettings file and add it to gitignore so the change will not effect others
            .Build();

        var connectionString = config.GetConnectionString("MyContextDb");
        return connectionString;
    }

    /// <summary>
    /// Gets the current soution base path
    /// </summary>
    /// <returns></returns>
    public static string GetSolutionBasePath()
    {
        var appPath = PlatformServices.Default.Application.ApplicationBasePath;
        var binPosition = appPath.IndexOf("\\bin", StringComparison.Ordinal);
        var basePath = appPath.Remove(binPosition);

        var backslashPosition = basePath.LastIndexOf("\\", StringComparison.Ordinal);
        basePath = basePath.Remove(backslashPosition);
        return basePath;
    }
}


Related

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