Chaîne de connexion principale Entity Framework - Variable d'environnement

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

Question

J'ai une application de base .net utilisant le noyau de l'entité. Lorsque j'exécute des migrations ou des mises à jour de structure d'entité via la ligne de commande, la valeur "ne peut pas être nulle. Nom du paramètre: connectionString"

La chaîne de connexion est conservée en tant que variable d'environnement:

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

Cependant, lorsque je déplace la même chaîne de connexion dans un fichier de configuration .json:

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

Ensuite, les outils de structure d'entité reconnaissent la chaîne de connexion sans problème. Lors du débogage du code, dans Startup.cs:

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

la variable connectionString est définie sur la chaîne correcte lorsque la chaîne est stockée dans l' un des deux emplacements, mais elle se bloque lors de la tentative de connexion à la base de données lors de l'utilisation de la variable d'environnement.

(Remarque: dans le cas de la variable d’environnement, la chaîne de connexion est échappée et passe donc de

(localdb)\\MSSQLLocalDB...

à

(localdb)\\\\MSSQLLocalDB...

mais le problème persiste même après la suppression des barres obliques)

UPDATE: Lorsque la chaîne de connexion est déplacée dans une variable d'environnement de niveau Windows, cela fonctionne correctement. Cela semble être un problème uniquement lors de l'utilisation de variables d'environnement Visual Studio.

Réponse populaire

Je vous suggère d'utiliser une classe DesignTimeContextFactory pour les migrations:

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);
    }
}

La chaîne GetConnection pour moi est la suivante et je l'utilise dans toute mon application (pour mon projet d'API Web et pour les tests d'intégration):

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

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi