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?
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>
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:
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
@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!
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.