我们一直在尝试在.Net Standard 1.6类库中运行EF Core Migration,但它一直在失败。但是.Net Core 1.1类库中的传递非常好。
.NET STANDARD是否支持EF Migration?
答案 0 :(得分:21)
当DbContext
放置在netstandardx.y
类库中时,文档将此案例视为know issue /限制。
解决方法1 - 使用应用作为启动项目
如果您有现有的.NET核心应用程序或.NET Framework应用程序(包括ASP.NET核心Web应用程序),则可以将其用作启动项目。如果没有,您可以创建一个新的仅用于.NET命令行工具。 指定一个“可运行的应用程序”的启动项目。 示例:console
dotnet ef migrations list --startup-project ../MyConsoleApp/
解决方法2 - 跨目标可运行框架
向类库项目添加其他目标框架。这可以是.NET Core App或.NET Framework的一个版本。 要使项目成为.NET Core App,请将“netcoreapp1.0”框架添加到项目中,如下例所示: XML
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netcoreapp1.0;netstandard1.4</TargetFrameworks> </PropertyGroup> </Project>
以.NET Framework为目标时,请确保将项目目标设为4.5.1或更高版本。 XML
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net46;netstandard1.4</TargetFrameworks> </PropertyGroup> </Project>
答案 1 :(得分:10)
对于看到以下错误的EF Core Package Manager控制台工具用户:
启动项目'MyNetStandardLibrary'以框架'.NETStandard'为目标。没有与此框架关联的运行时,并且无法直接执行以其为目标的项目。要将Entity Framework核心软件包管理器控制台工具与此项目一起使用,请添加一个针对引用此项目的.NET Framework或.NET Core的可执行项目,并将其设置为启动项目;或者,更新此项目以跨目标.NET Framework或.NET Core。
OR
您的目标项目“MyNetCoreApp”与您的迁移程序集“MyNetStandardLibrary”不匹配。更改目标项目或更改迁移程序集。
documentation揭示了导致这些错误的原因:
目标项目是添加任何文件的位置(或在某些情况下删除)。目标项目默认为在Package Manager Console中选择的Default项目,但也可以使用-Project参数指定。
启动项目是在执行项目代码时由工具模拟的项目。它在解决方案资源管理器中默认为一个Set为StartUp Project。它也可以使用-StartupProject参数指定。
简而言之,您需要将StartUp项目设置为具有.NET运行时(在本例中为.NET Core)的项目,然后确保将.NET Standard项目设置为程序包管理器控制台&gt;默认项目。
示例CLI解决方案:
Add-Migration MyMigration -Project MyNetStandardLibrary -StartupProject MyNetCoreApp
非CLI解决方案:
答案 2 :(得分:4)
没关系,但是很复杂,我想解释一下。
案例:Asp.Net核心,我有一个包含Db-Context的标准库。我想迁移 在这种情况下,但是标准库不直接接受迁移,需要启动项目。
解决方案:启动项目能够间接创建迁移
Enable-Migrations MyMigration -Project DB-ContextProjectNameThatIsStandartLib -StartupProject CallerExecutableProjectName_LikeMVCWebProjectOrConsole
Add-Migration MyMigration -Project DB-ContextProjectNameThatIsStandartLib -StartupProject CallerExecutableProjectName_LikeMVCWebProjectOrConsole
我们将从Package Manager Console DropDown中选择Caller Project,但它将在库项目中创建迁移文件。 之后,不要从下拉菜单中选择其他项目,而直接从调用者项目中运行不带任何参数。
Update-Database
尝试奇怪但真实的
更新: 我已经将我的项目Asp.net EntityFrameworkCore 3.1.3升级到了3.1.4,而那些未成功运行的项目却给出了错误消息:
未在项目上安装EntityFramework软件包
和这个错误
无法创建“ DomainDbContext”类型的对象。为了 在设计时支持不同的模式
这是EntityFramework.Core应用程序!我也已将EntityFramework安装到标准库中。但它无法理解并重新启动V.S. 这次需要将实体框架安装到启动程序MVC(Web)项目中。我做不到我决定添加一个新的控制台应用程序来解决此要求。并为此创建了以下应用程序
install-Package Microsoft.Extensions.Configuration Install-Package Microsoft.Extensions.Configuration.Json Install-Package Microsoft.Extensions.Configuration.CommandLine Install-Package Microsoft.Extensions.Configuration.EnvironmentVariables
class Program
{
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<DomainDbContext>
{
public DomainDbContext CreateDbContext(string[] args)
{
IConfigurationRoot configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
//.SetBasePath(Directory.GetCurrentDirectory())
//.AddJsonFile("appsettings.json")
.Build();
var builder = new DbContextOptionsBuilder<DomainDbContext>();
var connectionString = configuration.GetConnectionString("DefaultConnection");
builder.UseSqlServer(connectionString);
return new DomainDbContext(builder.Options);
}
}
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
这一次它正常工作了!再次使用上述命令:)欢呼
答案 3 :(得分:2)
我还没有尝试使用.Net Standard 1.6,但它确实适用于2.0。
Microsoft.EntityFrameworkCore.Tools.DotNet
需要添加到其中包含DbContext
的每个类库中。右键单击该项目,然后选择Edit *.csproj
。然后,添加以下内容:
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0-preview2-final" />
</ItemGroup>
您可以在此处查看更深入的教程:EF 7 Migrations with multiple DBContexts
答案 4 :(得分:1)
@Tseng,谢谢!这是明确的说明。
编辑项目文件:
<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>
然后添加设计工厂:
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;
}
}
然后构建。
然后打开命令提示符,导航到您的项目文件夹,然后运行:
dotnet ef migrations add InitialCreate
现在应该有一个自动生成的迁移文件夹。喜欢它!
答案 5 :(得分:0)
对微软可耻。
我将我的dbcontext转移到了我的dotnet核心解决方案中的控制台应用程序中。
我的解决方案中有5个项目。
然后我运行dotnet ef migrations add CreateDatabase
我使用vs代码和dotnet cli。
答案 6 :(得分:-1)
我通过针对代码使用包管理控制台,并自动迁移了Xamarin(.net stadard 2.0项目)来完成这项工作。...
https://github.com/ngrumbine/EFDemo
获取代码...