web-dev-qa-db-fra.com

La migration d'EF Core Add est-elle prise en charge à partir de la bibliothèque standard .NET?

Nous avons essayé d'exécuter EF Core Migration dans la bibliothèque de classes .Net Standard 1.6, mais cela a échoué. Mais la même chose passe très bien dans la bibliothèque de classes .Net Core 1.1.

La migration EF est-elle prise en charge dans .NET STANDARD?

17
Abhijeet

La documentation couvre ce cas comme know issue /limitation lorsque le DbContext est placé à l'intérieur d'un netstandardx.y Bibliothèque de classes.

Solution de contournement 1 - Utilisez une application comme projet de démarrage

Si vous disposez d'une application .NET Core ou .NET Framework existante (y compris une application Web ASP.NET Core), vous pouvez l'utiliser comme projet de démarrage. Sinon, vous pouvez en créer un nouveau uniquement pour une utilisation avec les outils de ligne de commande .NET. Spécifiez un projet de démarrage qui est une "application exécutable". Exemple: console

dotnet ef migrations list --startup-project ../MyConsoleApp/

Solution de contournement 2 - cible croisée d'un cadre exécutable

Ajoutez un cadre cible supplémentaire au projet de bibliothèque de classes. Il peut s'agir d'une version de .NET Core App ou .NET Framework. Pour faire du projet une application .NET Core, ajoutez le framework "netcoreapp1.0" au projet comme dans l'exemple ci-dessous: XML

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netcoreapp1.0;netstandard1.4</TargetFrameworks>
  </PropertyGroup>
</Project>

Lorsque vous ciblez .NET Framework, assurez-vous que votre projet cible la version 4.5.1 ou plus récente. XML

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net46;netstandard1.4</TargetFrameworks>
  </PropertyGroup>
</Project>
24
Tseng

Pour vous, les utilisateurs des outils de la console EF Core Package Manager qui voient les erreurs suivantes:

Le projet de démarrage "MyNetStandardLibrary" cible le cadre ".NETStandard". Aucun environnement d'exécution n'est associé à ce cadre et les projets qui le ciblent ne peuvent pas être exécutés directement. Pour utiliser les outils de la console Entity Framework Core Package Manager avec ce projet, ajoutez un projet exécutable ciblant .NET Framework ou .NET Core qui référence ce projet et définissez-le comme projet de démarrage; ou, mettez à jour ce projet pour inter-cibler .NET Framework ou .NET Core.

OR

Votre projet cible 'MyNetCoreApp' ne correspond pas à votre ensemble de migrations 'MyNetStandardLibrary'. Modifiez votre projet cible ou modifiez votre assemblage de migrations.


Le documentation révèle la cause de ces erreurs:

Le projet cible est l'endroit où les fichiers sont ajoutés (ou dans certains cas supprimés). Le projet cible est par défaut le projet par défaut sélectionné dans la console du gestionnaire de packages, mais peut également être spécifié à l'aide du paramètre -Project.

Le projet de démarrage est celui émulé par les outils lors de l'exécution du code de votre projet. Il s'agit par défaut d'un ensemble en tant que projet de démarrage dans l'Explorateur de solutions. Il peut également être spécifié à l'aide du paramètre -StartupProject.

En un mot, vous devez définir votre projet de démarrage sur un projet qui a un runtime .NET (.NET Core dans ce cas), puis assurez-vous de définir votre projet .NET Standard en tant que console du gestionnaire de packages> projet par défaut.

Exemple de solution CLI:

Add-Migration MyMigration -Project MyNetStandardLibrary -StartupProject MyNetCoreApp

Solution non CLI:

  1. Cliquez avec le bouton droit sur l'application .NET Core dans votre projet
  2. Cliquez sur Définir comme projet de démarrage
  3. Ouvrez la console du gestionnaire de packages
  4. Sélectionnez votre projet .NET Standard dans la liste déroulante Projet par défaut de la console du gestionnaire de packages
  5. Exécutez votre commande CLI (Add-Migration, dotnet ef migrations add, etc.)
12
derekmx271

Je n'ai pas essayé avec .Net Standard 1.6 mais cela fonctionne pour 2.0.

Microsoft.EntityFrameworkCore.Tools.DotNet doit être ajouté à chacune de vos bibliothèques de classes contenant DbContext. Cliquez avec le bouton droit sur le projet et sélectionnez Edit *.csproj. Ajoutez ensuite les éléments suivants:

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0-preview2-final" />
  </ItemGroup>

Vous pouvez voir un tutoriel plus approfondi ici: Migrations EF 7 avec plusieurs DBContexts

2
Todd Skelton

@Tseng, merci! Voici des instructions explicites.

Modifier le fichier de projet:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.1" />
    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  </ItemGroup>
</Project>

Ensuite, ajoutez l'usine de conception:

 public class DesignTimeActivitiesDbContextFactory : IDesignTimeDbContextFactory<ActivitiesDbContext>
    {
        public ActivitiesDbContext CreateDbContext(string[] args)
        {
            DbContextOptionsBuilder<ActivitiesDbContext> builder = new DbContextOptionsBuilder<ActivitiesDbContext>();

            var context = new ActivitiesDbContext(
                builder
                .UseSqlServer("Data Source=(local);Initial Catalog=Activities;Integrated Security=False;User ID=user;Password=pw;Connect Timeout=30;Encrypt=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;")
                .Options);

            return context;
        }
    }

Puis construisez.

Ouvrez ensuite l'invite de commande, accédez au dossier de vos projets et exécutez:

dotnet ef migrations add InitialCreate

Maintenant, il devrait y avoir un dossier de migrations généré automatiquement. Aimer!

1
sikemullivan

honteux pour Microsoft.

j'ai transféré mon dbcontext vers l'application console dans ma solution de base dotnet.

ma solution contient 5 projets.

alors je cours dotnet ef migrations add CreateDatabase

j'utilise vs code et dotnet cli.

0
Setmax