【发布时间】: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