EF 4代码如何首先处理生产环境中的架构更改?

时间:2010-11-18 03:06:49

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

传统上我总是手工编写我的sql脚本,因此它们很好而且干净(我不是生成的脚本的粉丝)并且发布到发行版,我提供了一个全新的安装脚本和以前版本的迁移脚本这会创建新的表,改变现有的表等。这都非常标准。

我没有太多时间来使用EF 4代码,但如果它在生产环境中实际可行,我很有兴趣使用它。

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

方案

  1. 客户端在其服务器上安装asp.net MVC网站。首次运行时,将创建一个新数据库
  2. 客户使用网站一段时间,数据库会填充一些数据
  3. 同时发布了新版本的网站,并且EF模型已经更改
  4. 客户端下载新版本,部署网站并指向现有数据库
  5. 代码首先仅对初始部署有用,还是足够智能以更新现有数据库版本以便像这样发布?

5 个答案:

答案 0 :(得分:6)

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

话虽如此,EF团队正积极致力于完全解决您的方案的Database Evolution (aka Migrations) Solution随着对象模型随时间变化而演变数据库架构的解决方案基本上尝试将数据库更改为与模型同步,而不是重新创建它。

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

答案 1 :(得分:2)

创建数据库的能力只是Code First的一个功能 - 它是可选的功能。您根本不必使用此功能。事实上,Scott Gu有一篇专门讨论使用Code First with an existing database的博客文章。

在发布数据库迁移之前,您必须提出另一种策略,该策略将简单地按照您的传统方式管理ALTER TABLE脚本。因此,在部署新版本时,您将运行ALTER脚本并将包含更改的代码部署到模型中。

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

答案 2 :(得分:0)

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

https://github.com/rialib/efextensions

答案 3 :(得分:0)

几个月过去了,现在正式答案已经发布: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/

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

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

答案 4 :(得分:0)

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

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

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