【问题标题】:EF Core understanding migrationsEF Core 理解迁移
【发布时间】:2021-03-21 16:21:57
【问题描述】:

我在 EF Core 3.1 中遇到了一些奇怪的行为,这让我想知道实际发生了什么。所以希望有人可以详细地向我解释这一点。

场景

假设您有两个项目。项目 A(主要)和项目 B(副项目)。对于这两个项目,您都可以添加/删除迁移,因为项目 A 已设置为在启动时从项目 B 获取所有待处理的迁移并执行它们。

在项目 A 上执行dotnet ef migrations add Test -c AppDbContext -o DbContexts/Migrations/AppDb 并在完成后(甚至在将其应用到数据库之前)执行dotnet ef migrations remove -c AppDbContext,一切都按预期工作,并且迁移被删除。

另一方面,对于项目 B,在成功执行 add 命令后,当我尝试执行 remove 命令时(甚至在将其应用于数据库之前),我收到以下错误:

Microsoft.Data.SqlClient.SqlException (0x80131904):网络相关 或在建立连接时发生特定于实例的错误 SQL 服务器。服务器未找到或无法访问。核实 实例名称正确且 SQL Server 配置为 允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)

因此我将错误消息作为建议并开始关注this guide 以允许远程访问数据库。引导后,项目B的remove命令也成功执行。

但现在我想知道...为什么在我按照指南操作之前 EF Core 没有连接到(本地)数据库,它是否适用于项目 A,但不适用于 B....?

编辑

经过更多研究,我从指南中发现了帮助我解决错误的具体操作。这是在Sql Server 配置管理器中将TCP 端口设置为1433。显然这个字段是空的......但它给我留下了 1 个问题。

为什么add 命令在没有指定端口的情况下工作,而只有remove 命令抱怨连接?

EDIT2

还有一个新发现,将以下方法添加到 AppDbContext 类时:

protected override void OnConfiguring(DbContextOptionsBuilder options)
{
    options.UseSqlServer("foo");
    base.OnConfiguring(options);
}

add 命令工作正常,但remove 命令抱怨连接字符串的格式不正确

System.ArgumentException:初始化字符串的格式不符合从索引 0 开始的规范。

因此我们可以由此得出结论,add 命令不需要有效的连接字符串(因为它对数据库没有任何作用),而remove 命令确实需要有效的连接字符串...但是为什么呢? ?它对数据库没有任何作用,对吧?

【问题讨论】:

  • 你确定你在项目 B 上写了正确的 con 字符串吗?
  • @AVTUNEY ,我希望这就是问题所在。但我检查了 10 次,它与 add 命令的连接字符串完全相同。

标签: c# sql-server entity-framework-core ef-core-3.1


【解决方案1】:

作为对我自己问题的回答,这里解释了 addremove 迁移的工作原理。

add 迁移功能确实需要一个有效的字符串作为上下文中的连接字符串,但它不需要是正确的连接字符串,因为 EF Core 并未真正连接到数据库。

对于remove 迁移功能,您确实需要正确的连接字符串,因为 EF Core 会连接到数据库以将本地迁移列表与_EFMigrationsHistory 表进行比较,以检查是否有任何迁移尚未已应用于数据库。因为remove 功能只能删除 PENDING 迁移。因此,没有任何已应用于数据库的迁移。

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 2022-11-11
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多