EF 自动迁移向后兼容

Posted

技术标签:

【中文标题】EF 自动迁移向后兼容【英文标题】:EF automatic migrations backwards compatible 【发布时间】:2016-10-11 21:03:49 【问题描述】:

我有一个在 Azure 上运行的 EF 6.13 + MVC 5 网站,我正在尝试使用 Azure 的部署槽,它基本上总是有 2 个(或更多)站点在运行,同时使用相同的数据库和不同的版本在源代码中,将其视为 Slot1 具有当前生产代码,而 Slot2 具有 vNext 代码。

我遇到的问题是,当 Slot2 中发生迁移时,即使我们这样做是为了不影响兼容性,然后 EF 会抱怨DB 与 Model 的版本不同。

我已经阅读了这个问题:

EF backward compatible DB migrations How can I disable model compatibility checking in Entity Framework 4.3?

但在这两种情况下,他们确保 EF 不会抱怨模型的兼容性,方法是使用它的一些变体使其 NOT CHECK 完全兼容:

public class MyDBContext: DbContext 

    public MyDBContext() : base("myConnString")
                
        //Disable initializer
        Database.SetInitializer<MyDBContext>(null);
    
 

然而,我有一些不清楚的地方:

如果我更改了模型兼容性检查并且没有自动运行迁移,那么如何迁移我的数据库?

我可以让我的DbContext 检查模型兼容性并仅在它损坏时警告我(比如我删除了一个列或类似的东西,而不是我添加了另一个列,我知道这可能很麻烦但请忍耐我并假设我对这类事件有一个计划)

【问题讨论】:

【参考方案1】:

如果我更改了模型兼容性检查并且没有自动运行迁移,那么如何迁移我的数据库? 我在这里给你一个很好的答案: Dis-Advantages of using EF 6.x.x Code First without Migration

我可以让我的 DbContext 检查模型兼容性并仅在它损坏时警告我(比如我删除了一个列或类似的东西,而不是我添加了另一个列,我知道这可能很麻烦,但请耐心等待假设我对这类事件有一个计划)

要做到这一点并不容易。问题是您必须即时解码模型并将其与MigrationHistory 表的模型列进行比较。


这个链接可能对你来说也很有趣:

https://romiller.com/2012/03/26/dynamically-building-a-model-with-code-first/

https://romiller.com/2013/02/05/extending-and-customizing-code-first-models-part-1/

【讨论】:

感谢您的快速重播,我一直在浏览您提供给我的链接,但他们的目标不是我想要的。我希望不同版本的代码与同一个数据库“对话”(这将处于兼容状态)。 所以你有一个应用程序是用 EF 4.3 制作的,另一个应用程序是用 EF 6 制作的,你有一个数据库?这正是你想要的吗? 我有同一个应用程序的两个版本,只是几个 git-commits 不同,但其中一些提交可以有迁移,我很想知道是否有办法让两个版本都工作在同一个数据库上呆了很短的时间,然后他们又在同一个版本上,最多几天。

以上是关于EF 自动迁移向后兼容的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 6 中启用自动布局,同时保持向后兼容 iOS 5

App Sandbox/iCloud 和 Snow Leopard 向后兼容

dotnet-ef 与 net50 不兼容

佳能口适马ef自动镜头数码相机不兼容怎么办

Postgres-XL 向后兼容 PostgreSQL?

一分钟理解向后兼容