【问题标题】:How does EF 4 code first handle schema changes in a production environment?EF 4 代码如何首先处理生产环境中的架构更改?
【发布时间】:2011-05-11 19:29:15
【问题描述】:

传统上,我总是手工编写我的 sql 脚本,因此它们既漂亮又干净(我不喜欢生成的脚本)并且发布到发布,我提供了一个全新的安装脚本和一个来自以前版本的迁移脚本创建新表,更改现有表等。这都是非常标准的。

我真的没有太多时间先玩 EF 4 代码,但如果它在生产环境中确实可行,我很感兴趣使用它。

假设你有一个代码优先的方法,如果一个数据库不存在,它将自动创建。如果您发布具有架构/模型更改的新版本软件会发生什么。 EF 是否足够智能以更新数据库架构以匹配更新后的 EF 模型?

场景

  1. 客户端在其服务器上安装 asp.net MVC 网站。首次运行时,会创建一个新数据库
  2. 客户使用网站一段时间后,数据库中填充了一些数据
  3. 同时网站新版本发布,EF模型发生变化
  4. 客户端下载新版本,部署网站并指向现有数据库

代码首先只对初始部署有用,还是足够聪明地将现有数据库版本更新为这样的版本?

【问题讨论】:

    标签: asp.net-mvc entity-framework entity-framework-4 ef4-code-only


    【解决方案1】:

    使用 EF 6,您可以重新设计您的数据库(代码优先),确保已安装所有更新,有时您可能在现有数据库中有不同的架构以在您的上下文类中使用它们

     modelBuilder.Entity<Charge>().ToTable("FullDepot.Charge");
    

    如果你不选择 EF 只选择 dbo.yourtable 而不是 FullDepot.secondtable 等表格

    【讨论】:

      【解决方案2】:

      几个月过去了,现在官方答案已经发布:IDatabaseInitializer

      这里或多或少是你要找的东西:

      public class DoNothingWithMyDatabase<TContext> : IDatabaseInitializer<TContext>
          where TContext : DbContext
      {
          public void InitializeDatabase(TContext context)
          {
          }
      }
      

      取自这里:http://blog.cincura.net/231783-ultimate-efv4-ctp4-code-first-full-mapping-example-using-firebird/

      现在您可以按照习惯的方式转换架构。当然,您也可以编写更复杂的 DatabaseInitializer,使用 C# 而不是 SQL,并执行更复杂的操作,例如在执行之前检查是否需要更改,在更改表时转换数据等。

      另一个涉及修改表的一些细节的 StackOverflow 问题: Entity Framework Code First fluent API setting field properties in a for loop

      【讨论】:

        【解决方案3】:

        我正在开发数据库上下文初始化程序,如果模型和数据库架构不同步,它将通知网站管理员。这对于喜欢完全控制代码优先模型和数据库模式的开发人员很有用。看看吧:

        https://github.com/rialib/efextensions

        【讨论】:

          【解决方案4】:

          创建数据库的能力只是 Code First 的一个 特性——它是一个可选 特性。您根本不必使用此功能。事实上,Scott Gu 有一整篇博文专门介绍使用 Code First with an existing database

          在发布数据库迁移之前,您必须想出另一种策略,并且该策略将简单地像传统那样管理您的 ALTER TABLE 脚本。因此,当您部署新版本时,您需要运行 ALTER 脚本并部署包含模型更改的代码。

          说了这么多,您在 Code First 中获得了更多的选择,而不是每次都简单地删除和重新创建数据库(这只是一种选择)。您还可以将初始化程序设置为仅在模型更改时才重新创建数据库。您还可以将初始化程序设置为从不运行(在您手动管理对数据库的更改的情况下)。 This post 将为您提供有关 EF 数据库初始化程序的更多信息。

          【讨论】:

            【解决方案5】:

            从 EF CTP4 开始,每次更改对象模型时都会删除并重新创建数据库(这不是默认约定,您必须通过设置数据库初始化策略明确告诉 EF Code-First 这样做)。

            话虽如此,EF 团队正在积极开发一个 Database Evolution (aka Migrations) Solution,它完全可以解决您的场景:随着您的对象模型随着时间的推移而改变数据库架构的解决方案,它本质上试图改变数据库将与您的模型重新同步,而不是重新创建它。

            根据 EF 团队的说法,此功能将作为 EF 下一个版本的一部分提供,该版本有望在 2011 年第一季度发布。

            【讨论】:

            • 很高兴知道,尽管在该功能推出之前,我不认为这是我可以在办公室提倡的路线。
            • 是的,我不确定 EF 4 框架是否足够成熟来处理这个问题。感谢您的链接。我认为我会推迟这个功能,并在 2011 年初监视 EF 团队的更新。干杯!
            • @confusedGeek:即使在此功能发布之后,我相信没有企业会将他们的生产数据库提供给 EF 来为他们即时修复它。更改脚本始终必须通过 DBA,无论是由您编写还是由 EF 编写。
            • 我刚刚在链接的 msdn ef 博客上观看了样机视频。看起来很有趣。
            • @Joshua:没问题。顺便说一句,如果您衡量 ORM 成熟度的标准是其将数据库与您的对象模型同步的能力,那么我认为根本没有 ORM 足够成熟。请注意,核心功能已经存在,您可以使用它,但您只需要手动更改数据库,而不是将其提供给 EF。 EF 迁移解决方案实际上是一项额外功能,而不是核心功能。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-05
            • 1970-01-01
            • 1970-01-01
            • 2016-11-24
            • 1970-01-01
            相关资源
            最近更新 更多