使用Entity Framework Code First更新数据库架构

12

Entity Framework Code First 是一个开发新项目的很棒的框架。但如果要扩展现有数据库呢?

比如说我只想为现有数据实体添加一个额外的属性,有没有"Code First"的方法来做到这一点,还是必须使用 SQL Server Management Studio 或类似工具手动添加数据库列?

到目前为止,我所找到的只是如何在模式更改时从头重新生成整个数据库,但我不想丢失我的数据。

如果我没记错,Ruby on Rails 有一个工具可以生成反映新数据库变化的 SQL 脚本。EF Code First 有没有类似的方法呢?


如果您有任何重要的数据不希望丢失...我建议使用先模式后架构的模型。如果这不是一个选项呢?除了dba不可用之外,使用代码优先会带来哪些好处?请给我启示... - sam yi
@sam yi:写完这篇文章两年后,我倾向于同意你的评论——尽管从开发者的角度来看,代码优先的方法仍然很有吸引力。与折腾 SQL 命令并在之后更新我的 EF 类相比,简单地向类添加属性要容易得多。 - Adrian Grigore
4个回答

10

我目前正在使用EntityFramework.Migrations库,它解决了演变数据库模式的问题。它通过创建迁移类来生成SQL脚本以更新您的模式。

目前它仍处于测试版阶段,但我发现它很有用。不幸的是,您仍然需要生成数据迁移脚本。

您可以在这里找到更多信息。


7

很遗憾,目前无法通过EF code-first逐步构建数据库。ADO.NET团队描述了一些方法,但这些工具尚未发布。唯一的方法是使用数据库或模型优先方法。这意味着您可以直接在数据库中对更改进行建模并继续编码,或者您可以使用EDMX模型和Database Generation Power Pack逐步构建您的DB。您仍然可以通过EF 4.1中添加的新T4模板从EDMX生成DbContext,但您将失去定义实体类的方式(它们将由模板创建)。


3

我目前正在处理一个类似的问题。

我使用EF首先建模方法。我使用数据库项目,它会接收EF生成的sql语句。

基本上,我的数据库项目与普通项目一样,但表的sql语句是由EF建模生成的。

值得注意的是,数据库项目可以在不丢失所有数据的情况下生成现有数据库的更改脚本。您可以将数据库项目设置为在执行可能对数据有害的更改时发出警告并避免运行。

我还没有完全完成我的解决方案(正在更改EF用于生成sql的SsdlToSql10.tt,使其更适合数据库项目!)。


谢谢你的建议。我使用Visual Studio数据库模式比较工具来生成模式迁移,当我需要部署新版本时。它很好用,但更自动化的解决方案会更受欢迎。如果我有时间的话,我会看一下数据库项目,这听起来很有趣。 - Adrian Grigore

1

Visual Studio有一个名为Schema Comparison的工具。在修改代码后,您可以生成数据库,然后使用Schema Compare来增量修改您的数据库项目或另一个数据库。


1
谢谢您的建议。这正是我现在正在做的事情。它可以工作,但我正在寻找与EF更紧密集成的东西。实际上,EF.Migrations正是我正在寻找的。 - Adrian Grigore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接