实体框架 6 和迁移(当我没有默认数据库时)
本文关键字:默认 数据库 框架 迁移 实体 | 更新日期: 2023-09-27 17:55:44
我有一个解决方案,我没有一个默认数据库。我有一个 master 数据库,它为请求数据的客户返回连接字符串,每个客户都有自己的数据库。我正在使用迁移(并将自动迁移启用设置为 false)和代码优先。
命令"update-database"是从代码(Database.SetInitializer(new MigrateDatabaseToLatestVersion());)中"执行"的。
第一次一切正常,但是当我之后添加迁移时,我不能,因为有挂起的迁移。我无法从VS运行更新数据库,因为连接字符串是在运行时设置的。
使用迁移和实体框架 6 处理像我这样的设置的正确方法是什么?
提前非常感谢
您拥有的是所谓的多租户应用程序。是的,EF 迁移也可以支持这种情况。
您只需将迁移器从MigrateDatabaseToLatestVersion
更改为自定义迁移,以迁移为其创建上下文的确切数据库。
然后,忘记从Powershell控制台执行update-database
。这始终更新默认数据库!相反,您的自定义迁移器将自动更新您连接到的数据库。
自定义迁移器的完整源代码可以在我的博客条目中找到:
http://www.wiktorzychla.com/2013/05/entity-framework-5-code-first-multi.html
请注意,由于 EF 的 Eariler 版本中存在 bug,多租户方案中的迁移从 EF 6.1.3 开始正常工作。
由于此 bug,多租户应用程序可能会错误地将连接字符串分配给新创建的数据库上下文。
https://entityframework.codeplex.com/SourceControl/changeset/4187b1c308316a22b38ef533b1409024bc0f7406
中的Add-Migration
和Update-Database
仍引用数据库。
要创建一个DbContext
,这些命令要么使用其无参数构造函数(如果有的话),要么实例化一个IDbContextFactory<T>
(如果存在)并调用其Create
方法来获取一个。
运行时不使用此特定数据库这一事实并不重要,但是在设计时确实需要一个数据库来允许您添加迁移。