We have been trying to run EF Core Migration in .Net Standard 1.6 class library, but it has been failing. But same passes very well in .Net Core 1.1 class library.
Is EF Migration supported in .NET STANDARD?
We have been trying to run EF Core Migration in .Net Standard 1.6 class library, but it has been failing. But same passes very well in .Net Core 1.1 class library.
Is EF Migration supported in .NET STANDARD?
The documentation covers this case as know issue/limitation when the DbContext
is placed inside an netstandardx.y
Class Library.
Workaround 1 - Use an app as the startup project
If you have an existing .NET Core App or .NET Framework App (including an ASP.NET Core Web Application), you can use it as the startup project. If not, you can create a new one just for use with the .NET Command Line Tools. Specify a startup project that is a "runnable app." Example: console
dotnet ef migrations list --startup-project ../MyConsoleApp/
Workaround 2 - Cross-target a runnable framework
Add an additional target framework to the class library project. This can a version of either .NET Core App or .NET Framework. To make the project a .NET Core App, add the "netcoreapp1.0" framework to project like in the sample below: XML
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netcoreapp1.0;netstandard1.4</TargetFrameworks> </PropertyGroup> </Project>
When targeting .NET Framework, ensure you project targets version 4.5.1 or newer. XML
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net46;netstandard1.4</TargetFrameworks> </PropertyGroup> </Project>
For you EF Core Package Manager Console Tools users who are seeing the following errors:
Startup project 'MyNetStandardLibrary' targets framework '.NETStandard'. There is no runtime associated with this framework, and projects targeting it cannot be executed directly. To use the Entity Framework Core Package Manager Console Tools with this project, add an executable project targeting .NET Framework or .NET Core that references this project, and set it as the startup project; or, update this project to cross-target .NET Framework or .NET Core.
OR
Your target project 'MyNetCoreApp' doesn't match your migrations assembly 'MyNetStandardLibrary'. Either change your target project or change your migrations assembly.
The documentation reveals the cause of these errors:
The target project is where any files are added (or in some cases removed). The target project defaults to the Default project selected in Package Manager Console, but can also be specified using the -Project parameter.
The startup project is the one emulated by the tools when executing your project's code. It defaults to one Set as StartUp Project in Solution Explorer. It can also be specified using the -StartupProject parameter.
In a nutshell, you need to set your StartUp Project to a project that has a .NET runtime (.NET Core in this case), then make sure you set your .NET Standard project as the Package Manager Console > Default Project.
Example CLI Solution:
Add-Migration MyMigration -Project MyNetStandardLibrary -StartupProject MyNetCoreApp
Non-CLI Solution:
I haven't tried with .Net Standard 1.6 but It does work for 2.0.
Microsoft.EntityFrameworkCore.Tools.DotNet
needs to be added to each of your class libraries that have a DbContext
in them. Right click the project and select Edit *.csproj
. Then, add the following:
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0-preview2-final" />
</ItemGroup>
You can see a more in-depth tutorial here: EF 7 Migrations with multiple DBContexts
@Tseng, thank you! Here are explicit instructions.
Edit project file:
<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>
Then add design factory:
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;
}
}
Then build.
Then open command prompt, navigate to your projects folder, and run:
dotnet ef migrations add InitialCreate
Now there should be an auto-generated migrations folder. Love it!
shameful for Microsoft.
i transferred my dbcontext to console app in my dotnet core solution.
my solution has 5 projects in it.
then i run dotnet ef migrations add CreateDatabase
i use vs code and dotnet cli.