98 votes

ef core n'utilise pas ASPNETCORE_ENVIRONMENT lors de la mise à jour de la base de données.

J'utilise Visual Studio pour mettre à jour tous mes environnements avec une certaine migration. Cela avait bien fonctionné en utilisant la commande ci-dessous.

update-database -Migration initMigrationProduct -c ProductContext -Environment Production

Dans ef core 2.0, cette commande a été modifiée et le paramètre -Environment a été supprimé. Dans la documentation, il est dit.

"Avec la version 2.0, vous pouvez utiliser la variable d'environnement ASPNETCORE_ENVIRONMENT à la place."

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet

J'ai maintenant essayé toutes sortes de méthodes, mais lorsque je lance le programme update-database avec ef core 2.0, il n'utilise pas la fonction ASPNETCORE_ENVIRONMENT variable. J'ai essayé de la définir dans le registre, dans les propriétés de l'application.

Veuillez me dire ce que je dois faire pour que cela fonctionne pour mettre à jour différents environnements ?

Si je démarre l'application avec différents launchsettings cela fonctionne mais pas en utilisant la console du gestionnaire de paquets.

0 votes

Essayez set ASPNETCORE_ENVIRONMENT=EnvironmentName avant d'exécuter la commande.

2 votes

Utilisez-vous une invite PowerShell ? Vous devez utiliser $env:ASPNETCORE_ENVIRONMENT='EnvironmentName'

1 votes

J'ai essayé, j'ai défini ASPNETCORE_ENVIRONMENT=Production dans la console PM de visual studio mais il n'utilise pas l'environnement, il utilise juste le développement par défaut.

201voto

Martin Florin Points 461

Pour définir la variable ASPNETCORE_ENVIRONMENT dans la Package Manager Console (PMC), dans Visual Studio, en Production, utilisez d'abord cette commande

$env:ASPNETCORE_ENVIRONMENT='Production'

Vous pouvez alors utiliser

Update-Database

normalement.

9 votes

Ça a marché ! Juste par curiosité : dois-je le réinitialiser en développement ou sera-t-il automatiquement réinitialisé à chaque build ? à chaque démarrage de VS ?

9 votes

Cela devrait faire l'objet d'un peu plus de votes et probablement être ajouté à la documentation.

7 votes

@DavidLiang Il se réinitialise à chaque démarrage du VS.

33voto

brunochaina Points 310

À partir de EF Core 5.0, l'environnement peut également être fourni en utilisant l'argument --environment, mais vous devez également spécifier un jeton '--' avant :

dotnet ef database update -- --environment Production

Comme le documentation États :

Le jeton -- indique à dotnet ef de traiter tout ce qui suit comme un et de ne pas essayer de les analyser comme des options. Tout argument supplémentaire non non utilisés par dotnet ef sont transmis à l'app.

12voto

Hardy Hobeck Points 71

J'ai eu le même problème que le rapporteur de cette question et j'ai essayé la solution récente dans la console du gestionnaire de paquets (PMC) et défini la variable d'environnement avec la commande :

$env:ASPNETCORE_ENVIRONMENT='YOUR_ENVIRONMENT'

Malheureusement, j'ai une ConsoleApplication et j'utilise le constructeur d'hôte générique au démarrage avec Host.CreateDefaultBuilder() . Dans ce scénario, le préfixe de la variable d'environnement n'est pas ASPNETCORE_ mais DOTNET_ .

Pour moi, cette commande fonctionne dans PMC :

$env:DOTNET_ENVIRONMENT='YOUR_ENVIRONMENT'

Je tiens à remercier Martin Florin et les autres pour m'avoir guidé dans la bonne direction.

0 votes

Bonjour, j'ai supprimé le texte indiquant que vous n'étiez pas en mesure de publier un commentaire, car ce genre de déclaration ne devrait pas faire partie d'une réponse. De plus, cela ne s'appliquait pas ici puisque vous a fait postez une réponse et non un commentaire ;)

3voto

The Mighty Chris Points 848

Selon EntityFrameworkCore#6846 la solution correcte est d'utiliser le --environment l'option dotnet ef les commandes ne respectent pas ASPNETCORE_ENVIRONMENT

dotnet ef database update --environment Production

0 votes

@AlexeyStrakh Pour moi, le problème était que la Connection-String avait un nom différent dans l'environnement de développement.

4 votes

Selon la documentation officielle l'option --environment spécifie l'environnement de construction, et non l'environnement de configuration.

2 votes

La solution consistant à utiliser l'environnement dans le cli ef n'est plus valable et ef core 2.0 et suivants respectent maintenant les paramètres d'environnement ref : [ ]. [github.com/dotnet/efcore/issues/15026#issuecomment-472967827]](https://github.com/dotnet/efcore/issues/15026#issuecomment-472967827])

1voto

joakimja Points 1024

L'utilisation du gestionnaire de paquets dans Visual Studio était une impasse pour moi. La solution était la suivante :

  1. Ajouter ci-dessous dans .csproj dans le projet de démarrage de la solution :

    <ItemGroup>
        <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
    </ItemGroup>
  2. Ouvrez l'outil de commande (cmd) et allez dans le même dossier que celui où se trouve le .csproj du projet de démarrage (Default project).

  3. Exécutez la commande comme l'a suggéré Anton Toshik set ASPNETCORE_ENVIRONMENT=Production

4. puis exécuter la commande dotnet ef database update initMigrationProduct -c ProductContext Et maintenant ça marche.

REMARK dans cette commande database y update ont changé de place depuis les versions précédentes. Et il n'y a pas d'argument/code pour la migration. Les docs expliquent plus après cette clarification :
https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet

0 votes

J'ai rencontré le même problème quand j'ai tout mis à jour vers Core 2.0. La réponse de @bricelam fonctionne pour moi (même si je préfère l'ancienne méthode) et j'ai posté ce même problème et cette réponse ici : github.com/aspnet/EntityFrameworkCore/issues/9664

1 votes

J'essaie de faire cela pour l'environnement "Développement". J'ai rencontré le même problème mais je n'arrive pas à le faire fonctionner avec la solution ci-dessus. Je dispose d'appsettings.json et d'appsettings.development.json (chacun avec une chaîne de connexion à la base de données différente). L'approche ci-dessus ne fonctionne pas, que ce soit dans cmd ou dans le gestionnaire de paquets. La configuration est récupérée correctement dans les deux environnements dans l'application elle-même. J'aimerais avoir votre avis !

0 votes

Ce qui se passe, c'est que ef lit l'environnement à partir du paramètre ASPNETCORE_ENVIRONMENT. Avant de lancer la mise à jour de la base de données dans cmd, vérifiez l'environnement sur lequel vous pointez avec "echo %ASPNETCORE_ENVIRONMENT%". Et comme Deepinsight, vérifiez votre startup.cs et la ligne. .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional : true)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X