为什么“dotnet ef migrations add”启动我的应用程序?

问题描述 投票:0回答:2

我已经使用 .NET 6 和 EF Core 6 创建了一个新项目,但是当我尝试使用

dotnet ef migrations add
创建迁移时,CLI 在“构建成功”后开始运行应用程序。

这并不会阻止创建迁移,但会增加该过程的大量时间,因为我需要等待应用程序退出才能发出任何其他命令。

dotnet ef migrations
添加输出的片段:

snippet of dotnet ef migrations add output

在同一解决方案中,我还有许多其他使用 .NET 5 和 EF Core 5 的项目,它们都按预期创建迁移(仅构建项目,不运行它)。

这是 EF Core 6 的新功能还是某处的配置会导致此行为?

编辑

问题似乎是 EF Core 在迁移创建期间忽略了

IDesignTimeDbContext
工厂的实现,而是默认从主机构建器获取
DbContext
的实例。显然 EF Core 5 也会发生这种情况。

dotnet/efcore github 上有一个未解决的问题:Migrations 脚本不使用 IDesignTimeDbContextFactory

c# entity-framework-migrations .net-6.0 asp.net-core-6.0 ef-core-6.0
2个回答
5
投票

从 EF Core 7.0 开始,您可以基于标志执行代码

EF.IsDesignTime

当应用程序由 EF 设计时工具(如

dotnet ef migrations add
)执行时,Flag 将设置为 true。

您可以在此处此处找到更多详细信息。


4
投票

我也遇到这个问题了。我使用带有完整控制器的 ASP.Net Core 6 WebApi。

我看到march对GitHub问题的评论Migrations script not using IDesignTimeDbContextFactory),这给了我灵感。

所以,我在Program.cs中将

WebHost.CreateDefaultBuilder(args)
(在.NET6中已废弃)更改为
Host.CreateDefaultBuilder(args)
,现在问题解决了。不幸的是,我仍然不知道问题的具体原因。

“dotnet ef migrations add”仍会启动应用程序,但主机将抛出

StopTheHostException
来停止 ASP.NET Core 主机,然后将成功创建与迁移相关的文件,喜欢

Build started...
Build succeeded.
[16:46:18 INF] Configuring web host (Identity.API)...
[16:46:18 FTL] Program terminated unexpectedly (Identity.API)!
Microsoft.Extensions.Hosting.HostFactoryResolver+HostingListener+StopTheHostException: Exception of type 'Microsoft.Extensions.Hosting.HostFactoryResolver+HostingListener+StopTheHostException' was thrown.
   at Microsoft.Extensions.Hosting.HostFactoryResolver.HostingListener.OnNext(KeyValuePair`2 value)
   at System.Diagnostics.DiagnosticListener.Write(String name, Object value)
   at Microsoft.Extensions.Hosting.HostBuilder.Build()
   at Program.<<Main>$>g__CreateHostBuilder|0_0(IConfiguration configuration, String[] args) in G:\ASPNETCore\HongJieSun.Innermost\Services\Innermost.Identity\Innermost.Identity.API\Program.cs:line 47
   at Program.<Main>$(String[] args) in G:\ASPNETCore\HongJieSun.Innermost\Services\Innermost.Identity\Innermost.Identity.API\Program.cs:line 11
To undo this action, use Remove-Migration.
© www.soinside.com 2019 - 2024. All rights reserved.