14

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

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

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

设想

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

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

4

5 回答 5

6

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

话虽这么说,EF 团队正在积极开发数据库演进(又名迁移)解决方案,该解决方案可以准确解决您的场景:随着您的对象模型随着时间的推移而发生变化,该解决方案将演变数据库架构,本质上试图将数据库更改为返回与您的模型同步,而不是重新创建它。

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

于 2010-11-18T03:28:05.063 回答
2

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

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

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

于 2010-11-18T04:24:18.303 回答
0

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

https://github.com/rialib/efextensions

于 2011-03-03T01:10:44.410 回答
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/

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

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

于 2011-05-08T02:27:14.510 回答
0

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

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

如果你不 EF 只接dbo.yourtable而不是FullDepot.secondtable等表

于 2015-07-16T06:53:05.740 回答