EF6,每个客户端有一个数据库(相同上下文)



我正在开发一个ASP.Net MVC 5应用程序,它将成为我的客户的SaaS。我想使用EF6,目前正在使用localDb。我是一个实体框架的初学者,我很难学习它。在过去的两天里,我一直在网上搜索,找到了不同的方法,但从未找到能回答我问题的清晰的东西。

我在ASP.Net MVC 4和5上学习了Scott Allen教程,所以目前,我有两个上下文,"IdendityDbContext"one_answers"MyAppDbContext",它们都使用名为MyAppDb.mdf 的数据库指向DefaultConnection字符串

我希望我的客户能够登录网站并连接到他们自己的数据库,所以我计划为我的每个客户创建一个新的ConnectionString(和数据库),并使用我的IdendityDbContext为我的客户保留一个ConnectionString帐户信息。

我有很多问题,但这里有两个最重要的问题:

1) 我不知道如何做到这一点并在本地进行测试。我是否必须为所有客户端创建新的数据连接,当客户端连接时,我会动态编辑连接字符串并将其传递给"MyAppContext"?

2) 即使我能够做到这一点,假设我有200个客户,这意味着我将拥有201个数据库:1个帐户数据库(IdentityDbContext)和200个客户端数据库(MyAppDbContext)。如果我将来更改我的模型,这是否意味着我必须为200个数据库中的每个数据库运行包管理器控制台迁移命令行?这似乎很残忍。必须有一种方法可以在每个客户端数据库上轻松地传播我的模型,对吧?

很抱歉发了这么长的帖子,提前非常感谢。

(1)的答案基本上是"是",您只需要这样做。(2)的答案是,您必须对所有数据库运行迁移。我无法想象你会怎么认为还有其他方法可以做到这一点,你有200个独立的数据库,它们都需要相同的模式更改。实现这一点的唯一方法是对它们中的每一个运行相同的脚本(或迁移)。这是单一租户模式的缺点。

由于您对这一切都是新手,因此您应该知道一些事情。首先,LocalDB仅用于开发。在开发过程中使用它是可以的,但请记住,在部署时需要一个完整的SQL Server实例。令人惊讶的是,这是一个常见的挂断,所以我只想确保你知道外面的大门。

其次,迁移,至少是代码优先的迁移,对于开发来说也是。您永远不应该针对生产数据库运行代码优先迁移。这不仅需要您直接从Visual Studio访问生产数据库,这本身就是一个很大的禁忌,而且除非您明确知道发生了什么变化,在哪里发生变化,否则生产数据库上不应该发生任何事情。我有一篇关于如何迁移生产数据库的文章,可能值得一看

不过,对于类似于200个数据库的场景,投资RedGate这样的东西可能会更好。

最新更新