【问题标题】:How to rename a table and some columns in production如何重命名生产中的表和某些列
【发布时间】:2015-02-10 21:08:17
【问题描述】:

我正在使用实体框架来处理服务器应用程序中的数据库。服务器应用程序部署到位于负载均衡器后面的多个节点。我现在发现需要重命名数据库中的一些表和一些表列。问题是我需要在没有任何停机时间的情况下执行此操作。

如果我正在编写自己的数据库层,我可以简单地检查数据库的结构,然后根据数据库结构是否升级运行不同的代码,然后我可能会有 0% 的停机时间。

是否可以在实体框架 4 中执行类似的操作,或者我如何在生产环境中使用实体框架实际更改数据库?我在网上搜索了任何解决方案,但没有成功。我还考虑过在我的应用程序中使用 2 个实体框架实例,但我必须编写在它们之间切换的代码量太多且容易出错。

所以总结一下这个问题: 有没有什么方法可以在生产环境中使用 Entity Framework 4 重命名数据库中的表和列,并且不会造成任何停机?

编辑 我得到的一个新想法是使用引用新表的旧命名方案创建一个视图来代替旧表。我不知道这是否可行。为了让它工作,Entity Framework 需要接受这个视图,就像它是一个普通的表一样。这是个好主意吗?有人用 EF4 尝试过这样的事情吗?

【问题讨论】:

    标签: mysql .net c#-4.0 entity-framework-4


    【解决方案1】:

    好的!这是我的想法 - 在数据库中创建新表,而不是重命名并在其上构建 EntityFramework 解决方案。

    您需要通过从负载均衡器中取出一台服务器来进行部署,对其进行更新,将实体框架代码指向新的表结构,然后再次附加到负载均衡器。

    对负载均衡器中的所有服务器一一进行相同的程序。一旦所有更新的补丁都完成了,然后同步旧表和新表,然后删除旧表。我建议同步这些表,以便您拥有所有数据而不会在上述过程中发生数据丢失。

    【讨论】:

    • 我也考虑过这一点,但由于每个请求都可以在任一节点中结束,而且它只是一个普通表,我无法合并表,因为我永远不知道哪一行更新跨度>
    • 这就是为什么我建议需要在新旧表之间进行同步。您可以使用 SQL 中的 Merge 操作将新表中的值添加到不匹配的行中。这将是手动过程,可以在服务器负载最小时完成。
    • 抱歉,这是不可能的,因为服务器负载是恒定的,我永远无法知道哪些行是正确的。
    • 没有问题。如果您找到更好的选择,请告诉我。很想知道。
    • 初步测试似乎表明使用视图实际上可以工作。它似乎在编译的 .exe 文件中工作,但如果我尝试在实体框架中更新模型,它会失败。但这不应该是一个问题。将继续对此进行测试。
    猜你喜欢
    • 2018-02-12
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多