EF6,每个客户端一个数据库(相同的上下文)
Posted
技术标签:
【中文标题】EF6,每个客户端一个数据库(相同的上下文)【英文标题】:EF6 with one database per client (same context) 【发布时间】:2015-04-14 22:09:03 【问题描述】:我正在开发一个 ASP.Net MVC 5 应用程序,它将成为我的客户的 SaaS。我想使用 EF6,我目前正在使用 localDb。我是一个实体框架初学者,我很难学习它。过去 2 天我一直在网上搜索,找到了不同的方法,但从未找到可以回答我问题的明确方法。
我在 ASP.Net MVC 4 和 5 上遵循 Scott Allen 教程,所以目前,我有 2 个上下文,“IdendityDbContext”和“MyAppDbContext”都使用名为 MyAppDb.mdf 的数据库指向 DefaultConnection 字符串
我希望我的客户能够登录网站并连接到他们自己的数据库,因此我计划为我的每个客户创建一个新的 ConnectionString(和数据库),并使用我的为我的客户帐户信息保留一个 ConnectionString IdendityDbContext。
我有很多问题,但这里有两个最重要的问题:
1) 我不确定如何在本地进行测试。我是否必须为所有客户端创建新的数据连接,当客户端连接时,我动态编辑连接字符串并将其传递给“MyAppContext”?
2) 即使我能够做到这一点,假设我有 200 个客户,这意味着我将拥有 201 个数据库:1 个帐户数据库 (IdentityDbContext) 和 200 个客户数据库 (MyAppDbContext)。如果我将来更改模型,是否意味着我必须为 200 个数据库中的每一个运行包管理器控制台迁移命令行?这似乎很残酷。必须有一种方法可以在每个客户端数据库上轻松传播我的模型,对吧?
抱歉发了这么长的帖子,提前非常感谢您。
【问题讨论】:
请一次问一个问题。这两个问题非常不同。 【参考方案1】:(1) 的答案基本上是“是”,您需要这样做。 (2) 的答案是您必须对所有数据库运行迁移。我无法想象您会如何认为还有其他方法可以做到这一点,您有 200 个单独的数据库,它们都需要相同的模式更改。实现这一点的唯一方法是对它们中的每一个运行相同的脚本(或迁移)。这就是你所拥有的单租户模型的缺点。
【讨论】:
非常感谢您的回答。所以你建议我应该为我的客户提供 1 个数据库?我也搜索过,但我不明白如何实现。 我不是在建议一种或另一种方式。只有您和您的要求才能决定您应该是单租户还是多租户。从来没有一个完美的解决方案,总是有取舍。搜索这些术语并权衡取舍,然后做出决定。【参考方案2】:由于您不熟悉这一切,因此您应该知道一些事情。首先,LocalDB 仅用于开发。在开发时使用它很好,但请记住,在部署时您将需要一个完整的 SQL Server 实例。令人惊讶的是,这种挂断的情况如此普遍,所以我只想确保你知道门外。
其次,迁移,至少是代码优先迁移,也是用于开发的。您永远不应该针对生产数据库运行代码优先迁移。这不仅需要您直接从 Visual Studio 实际访问生产数据库,这本身就是一个很大的禁忌,而且除非您明确知道发生了什么变化,否则在生产数据库上不会发生任何事情。我有一个 write-up about how to migrate production databases 可能值得一看。
不过,对于像您的 200 个数据库这样的场景,最好从 Red Gate 投资类似的东西。
【讨论】:
非常感谢。我去看看!以上是关于EF6,每个客户端一个数据库(相同的上下文)的主要内容,如果未能解决你的问题,请参考以下文章