我在EF Core 3.1中遇到了一些奇怪的行为,这让我想知道到底发生了什么。所以希望有人能在所有细节中向我解释。
场景
假设你有两个项目。项目A(主要)和项目B(附带项目)。对于这两个项目,您可以添加/删除迁移,因为项目A被设置为在启动时从项目B获取所有挂起的迁移并执行它们。
在项目A上执行dotnet ef migrations add Test -c AppDbContext -o DbContexts/Migrations/AppDb时,在完成(甚至在将其应用于DB之前)执行dotnet ef migrations remove -c AppDbContext时,一切都按预期工作,迁移将被删除。
另一方面,对于项目B,在成功执行add命令之后,当我尝试执行remove命令时(甚至在将它应用于DB之前),我会得到以下错误:
Microsoft.Data.SqlClient.SqlException (0x80131904):在建立到Server的连接时发生了与网络相关的或特定于实例的错误。找不到或无法访问服务器。验证实例名是否正确,以及Server是否配置为允许远程连接。(提供者:命名管道提供程序,错误: 40 -无法打开到Server的连接)
因此,我将错误消息作为建议,并开始遵循本指南,以允许远程访问数据库。在指南之后,项目B上的remove命令也被成功地执行了。
但现在我想知道..。为什么EF核心在我遵循指南之前没有连接到(本地) DB,并且它在项目A上工作,而不是在B上.?
编辑
经过进一步的研究,我发现了指南中帮助我解决错误的具体行动。它将Server配置管理器中的TCP端口设置为1433。显然这片土地是空的..。但我还有一个问题要问。
为什么add命令在没有指定端口的情况下工作,并且只有remove命令抱怨连接?
EDIT2
在将以下方法添加到AppDbContext类时,又发现了另一个新发现:
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlServer("foo");
base.OnConfiguring(options);
}add命令工作正常,但remove命令抱怨连接字符串格式不正确。
System.ArgumentException:初始化字符串的格式不符合从索引0开始的规范。
因此,我们可以由此得出结论,add命令不需要有效的连接字符串(因为它对DB不做任何操作),而remove命令确实需要一个有效的连接字符串.但为什么?它对数据库没有任何作用,对吧?
发布于 2020-12-10 12:04:30
作为对我自己问题的回答,这里解释了add和remove迁移是如何工作的。
add迁移功能确实需要一个有效的字符串作为上下文中的连接字符串,但它不需要是正确的连接字符串,因为require并不是真正连接到DB的。
对于remove迁移功能,确实需要一个正确的连接字符串,因为require连接到DB,以便将本地迁移列表与_EFMigrationsHistory表进行比较,以检查是否存在未应用于DB的迁移。因为remove功能只能删除挂起的迁移。因此,没有任何已经应用于DB的迁移。
https://stackoverflow.com/questions/65231237
复制相似问题