Entity Framework 6 和当我没有默认数据库时的迁移

Entity Framework 6 and migration when I don't have a default Database

我有一个没有默认数据库的解决方案。我有一个主数据库,它为请求数据的客户返回一个连接字符串,每个客户都有自己的数据库。我正在使用迁移(并将 AutomaticMigrationsEnabled 设置为 false)和代码优先。

命令“update-database”从代码中“执行”(Database.SetInitializer(new MigrateDatabaseToLatestVersion());)。

第一次一切正常,但是当我之后添加迁移时,我不能,因为有待处理的迁移。我无法从 VS 运行 更新数据库,因为连接字符串是在 运行 时间设置的。

使用迁移和 Entity Framework 6 处理像我这样的设置的正确方法是什么?

非常感谢

您拥有的是所谓的 multitenant 应用程序。是的,EF 迁移也可以支持这种情况。

您只需将您的迁移器从 MigrateDatabaseToLatestVersion 更改为自定义迁移器,该迁移器将迁移为其创建上下文的确切数据库。

然后,忘记从 powershell 控制台执行 update-database。这总是更新默认数据库!相反,您的自定义迁移器将自动更新您连接的数据库。

自定义迁移器的完整源代码可以在我的博客条目中找到:

http://www.wiktorzychla.com/2013/05/entity-framework-5-code-first-multi.html

请注意,由于早期版本的 EF 中存在错误,多租户场景中的迁移可以正常工作从 EF 6.1.3 开始。

由于这个错误,您的多租户应用程序可能会错误地将连接字符串分配给新创建的数据库上下文。

https://entityframework.codeplex.com/SourceControl/changeset/4187b1c308316a22b38ef533b1409024bc0f7406

控制台中的

Add-MigrationUpdate-Database 仍然引用数据库。

要创建一个 DbContext,这些命令要么使用它的无参数构造函数(如果有的话),要么实例化一个 IDbContextFactory<T>(如果存在)并调用它的 Create 方法来得到一个。

您在 运行 时不使用此特定数据库这一事实并不重要,但您确实需要在设计时的某个位置添加迁移。