C# .NET标准库是否支持EF Core添加迁移?
我们一直在尝试在.Net标准1.6类库中运行EF核心迁移,但一直失败。但在.NETCore1.1类库中同样可以很好地通过 .NET标准是否支持EF迁移C# .NET标准库是否支持EF Core添加迁移?,c#,asp.net-core,entity-framework-core,.net-standard,C#,Asp.net Core,Entity Framework Core,.net Standard,我们一直在尝试在.Net标准1.6类库中运行EF核心迁移,但一直失败。但在.NETCore1.1类库中同样可以很好地通过 .NET标准是否支持EF迁移 当DbContext被放置在netstandardx.y类库中时,文档将这种情况视为限制 解决方法1-将应用程序用作启动项目 如果您有现有的.NET Core应用程序或.NET Framework应用程序(包括ASP.NET Core Web应用程序),则可以将其用作启动项目。如果没有,您可以创建一个新的,仅用于.NET命令行工具。 指定“可运行
当
DbContext
被放置在netstandardx.y
类库中时,文档将这种情况视为限制
解决方法1-将应用程序用作启动项目
如果您有现有的.NET Core应用程序或.NET Framework应用程序(包括ASP.NET Core Web应用程序),则可以将其用作启动项目。如果没有,您可以创建一个新的,仅用于.NET命令行工具。
指定“可运行应用程序”的启动项目
示例:控制台
dotnet ef migrations list --startup-project ../MyConsoleApp/
解决方案2-跨目标可运行框架
向类库项目添加其他目标框架。这可以是.NET核心应用程序或.NET Framework的一个版本。
要使项目成为.NET核心应用程序,请将“netcoreapp1.0”框架添加到项目中,如以下示例所示:
XML
netcoreapp1.0;netstandard1.4
以.NET Framework为目标时,请确保以4.5.1或更高版本为项目目标。
XML
net46;netstandard1.4
我还没有尝试使用.Net标准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 Core Package Manager控制台工具用户:
启动项目“MyNetStandardLibrary”以框架.NETStandard为目标。没有与此框架关联的运行时,无法直接执行针对它的项目。要在此项目中使用Entity Framework Core Package Manager控制台工具,请添加引用此项目的针对.NET Framework或.NET Core的可执行项目,并将其设置为启动项目;或者,将此项目更新为跨目标.NET Framework或.NET Core
或
目标项目“MyNetCoreApp”与迁移程序集“MyNetStandardLibrary”不匹配。更改目标项目或更改迁移程序集
显示了这些错误的原因: 目标项目是添加(或在某些情况下删除)任何文件的位置。目标项目默认为在PackageManager控制台中选择的默认项目,但也可以使用-project参数指定 启动项目是在执行项目代码时由工具模拟的项目。在解决方案资源管理器中,它默认设置为一个启动项目。也可以使用-StartupProject参数指定 简而言之,您需要将启动项目设置为具有.NET运行时的项目(本例中为.NET Core),然后确保将.NET标准项目设置为Package Manager Console>Default项目 示例CLI解决方案:
Add-Migration MyMigration -Project MyNetStandardLibrary -StartupProject MyNetCoreApp
非CLI解决方案:
Add-Migration MyMigration -Project MyNetStandardLibrary -StartupProject MyNetCoreApp
@曾,谢谢!!这里有明确的指示 编辑项目文件:
<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>
现在应该有一个自动生成的迁移文件夹。爱死它了 好吧,但这很复杂,我想解释一下 案例:Asp.NETCore,我有一个包含Db上下文的标准库。我想迁移 此上下文但标准库不直接接受迁移,需要启动项目 解决方案:启动项目能够间接创建迁移
Enable-Migrations MyMigration -Project DB-ContextProjectNameThatIsStandartLib -StartupProject CallerExecutableProjectName_LikeMVCWebProjectOrConsole
Add-Migration MyMigration -Project DB-ContextProjectNameThatIsStandartLib -StartupProject CallerExecutableProjectName_LikeMVCWebProjectOrConsole
我们将从PackageManager控制台下拉列表中选择Caller项目,但它将在库项目中创建迁移文件。
之后,不要从下拉列表中选择其他项目,直接从调用者项目运行update,无需任何参数
Update-Database
试试奇怪但真实的方法
更新:
我已将我的项目Asp.net EntityFrameworkCore 3.1.3升级到3.1.4,而在上面的项目尚未正常工作,并给出了一个错误:
项目上未安装EntityFramework包
这个错误呢
无法创建“DomainDbContext”类型的对象。对于
设计时支持的不同模式
这是一个EntityFramework.Core应用程序!我还将EntityFramework安装到standart库中。但它无法理解并重新启动了V.S。
这一次,它需要将entityframework安装到starter MVC(Web)项目中。我不能那样做。我决定添加一个新的控制台应用程序来解决这个需求。并为此创建了以下应用程序
类程序
{
公共类DesignTimeDbContextFactory:IDesignTimeDbContextFactory
{
public DomainDbContext CreateDbContext(字符串[]args)
{
IConfigurationRoot配置=新配置生成器()
.AddJsonFile(“appsettings.json”,可选:true,重载更改:true)
.AddenEnvironmentVariables()
//.SetBasePath(目录.GetCurrentDirectory())
//.AddJsonFile(“appsettings.json”)
.Build();
var builder=new DbContextOptionsBuilder();
var connectionString=configuration.GetConnectionString(“DefaultConnection”);
使用SQLServer(connectionString);
返回新的DomainDbContext(builder.Options);
}
}
静态void Main(字符串[]参数)
{
dotnet ef migrations add InitialCreate
Enable-Migrations MyMigration -Project DB-ContextProjectNameThatIsStandartLib -StartupProject CallerExecutableProjectName_LikeMVCWebProjectOrConsole
Add-Migration MyMigration -Project DB-ContextProjectNameThatIsStandartLib -StartupProject CallerExecutableProjectName_LikeMVCWebProjectOrConsole
Update-Database
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!");
}
}