EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

EntityFrameworkCore 中使用多个DBContext时的注意事项

如果你是想同时生成两套数据库,那是不可能的,你需要一个一个生成。

但是这并不是说你要分别建立数据库上下文,你可以同时建立多个数据库上下文,在Add-Migration的时候选择使用哪个数据库。

比如微软会提醒你:

More than one DbContext was found. Specify which one to use. Use the '-Context' parameter for PowerShell commands and the '--context' parameter for dotnet commands.

那我们按照微软说的:

Add-Migration Init -context MyDbContext

即可。


删除尚未应用到数据库的最新迁移

Add-Migration Init -context MyDbContext

EF Core删除迁移的命令是Remove-Migration。一次只删除一个迁移,并且仅删除尚未应用到数据库的最新迁移。如果强行删除已经应用到数据库的迁移,会抛出异常。


前提:已经按顺序应用了Migration1、Migration2和Migration3,想要删除Migration2和Migration3。


删除已经应用到数据库的迁移

如果你想删除已经应用到数据库的迁移,那么直接

Update-Database Migration1

即可。

执行该指令可以直接撤销2和3的更改。EF Core还会从__EFMigrationsHistory表中删除2和3的迁移记录。

然后我们再按照顺序:

Remove-Migration Migration3
Remove-Migration Migration2

为什么一定要删除?

因为你的下一次迁移一定会重新执行一遍2、3的内容,所以必须删除。

注意:不应手动删除!

Remove-Migration 

在不注明参数的时候,默认是删除最后的一个迁移。

get-help Remove-Migration

查看帮助文档。


额外补充一个小问题:

当你一个数据库是SQL Server,一个数据库是SQLite的时候,

你不小心把SQLite的DbContext中UseSQLServer了,并且还初始化了一个迁移,但是没应用到数据库,

此时你想要删除迁移,使用了

Remove-Migration -Context MyDbContext

结果发现:

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40 - 无法打开与 SQL Server 的连接)

这说明Remove-Migration实际上会动数据库的那张记录表。

所以,无论如何,你都不应该手动操作数据库里面专门用于迁移的那一张表。

那张表,无论如何,都应当保留,除非你的项目完结。

This article was last edited at 2020-08-22 16:01:53

* *