为什么应用程序以 dotnet ef migrations add 启动?

2024-01-24

我在 VS2019 的开发人员 PowerShell 中使用 EF Core 工具时出现奇怪的行为。

使用此命令创建迁移后:

dotnet ef migrations add VisibleLink -p .\src\Only.Portal.Data\ -s .\src\Only.Portal.Web

它导致启动我的应用程序,但以前没有。应用上次迁移的方法,这会导致dotnet ef migrations remove完全崩溃了,因为使用它时,它首先启动一个应用程序,然后调用`Migrate()。

然后我收到一条消息:

迁移“20220128090939_VisibleLink”已应用于数据库。恢复并重试。如果迁移已应用于其他数据库,请考虑使用新的迁移来恢复其更改

看起来像是死循环。


I'm not satisfied with author's own answer marked as accepted solution. It's very unclear to me what the actual "solution" is here. It is only mentioned that one should "use Startup". No mention of the exact thing that actually resolves the issue.

我正在运行一个具有最少启动 API 的 .NET 6 ASP.NET 应用程序,并遇到了同样的问题。dotnet ef migrations会调用我的启动代码,导致整个应用程序尝试启动,然后失败(特别是我有一个在启动时直接运行的服务,它尝试使用我正在积极尝试为其创建迁移的数据库表)。

我通过放弃最小的 API 并创建一个来解决这个问题Program类,带有“假”public static IHostBuilder CreateHostBuilder method.

public class Program
{
    // Have a Main that actually runs/starts your app with all the logic
    public static async Task Main(string[] args)
    {
        // Here I do automatic migrations...
        // ...

        // Web app initialization logic
        var builder = WebApplication.CreateBuilder(args);
        builder.Services.AddRazorPages();

        var app = builder.Build();

        app.UseAuthentication();
        app.UseAuthorization();
        app
            .MapControllers()
            .RequireAuthorization();
        // etc.

        await app.RunAsync();
    }
    
    // Have a CreateHostBuilder that simply returns a default builder.
    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        Console.WriteLine("Doing Entity Framework migrations stuff, not starting full application");
        return Host.CreateDefaultBuilder();
    }
}

EF 将寻找CreateHostBuilder中的方法Program。如果找到它,它不会调用Main,并且基本上跳过 web 应用程序的整个初始化并返回一个非常空的主机构建器,足以让 EF 完成其工作。

这感觉有点像黑客,以后可能不起作用。

为 EF Core 7.0+ 用户提供更好的解决方案

如果您使用 EF Core 7.0 或更高版本,请参阅这个答案 https://stackoverflow.com/a/76127936/439094。现在,您可以在以下情况下返回空主机构建器:EF.IsDesignTime https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.ef.isdesigntime?view=efcore-7.0 is true:

// Program.cs

if (EF.IsDesignTime) {
    new HostBuilder().Build().Run();
    return;
}

// Normal startup
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();

var app = builder.Build();

app.UseAuthentication();
// ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么应用程序以 dotnet ef migrations add 启动? 的相关文章

  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐