如何更改数据库而不丢失数据?

时间:2012-03-27 07:03:32

标签: sql-server asp.net-mvc-3 entity-framework

我首先使用EF 4.1代码开发了一个网站,Mvc3,Sql Sever 2008 r2,然后部署了它。

主机上的数据库充满了关键数据,但仍然在增长。 现在我想向不同的表添加新列并添加新表。 即使我备份我的SQL并将其带到开发环境并使用base.seed()甚至使用SQL服务器管理创建脚本,我将丢失数据,我尝试了不同的方式,我找不到一种方法,我不会丢失数据。

我查看了代码首次迁移,但它没有解决我的问题。我的团队使用SQL服务器管理向数据库添加了一些表,如果我使用代码首次迁移,它将不会选择手动发生的更改。有人建议使用可以先从数据库创建代码的逆向工程工具,但这也会产生许多不需要的代码。

使用代码优先方法更改数据库的最佳方法或最佳做法是什么?

2 个答案:

答案 0 :(得分:3)

迁移会对您有所帮助。您只需编写当前数据库的脚本并在您的环境中重新创建它。然后,您需要add empty initial migration以当前数据库为起点。然后,您将添加所有新表和列,并让迁移完成其工作。当然可能存在问题,因为您在生产中手动更改了数据库,但这首先是您的团队失败,因为它违反了代码优先开发方法。如果这应该发生,你不应该使用代码第一种方法。

作为替代方案,只需使用新表和列开发新版本的应用程序,在开发环境中从应用程序创建数据库,并使用数据库工具进行模式比较,无论是在VS 2010(Premium或Ultimate)还是在其他商业工具中,如{ {3}}。这将能够创建用于将旧数据库模式升级到新数据库的diff SQL脚本。

答案 1 :(得分:2)

对于EF 4.1,您可以将Code First Migrations作为Nuget-package使用,让您在模型更改时迁移数据库。

自EF 4.3起,迁移现已包含在实体框架中。

ADO.NET团队在博客中介绍了如何开始使用EF 4.3 Migrations