EF 6 Code First Migrations与dbinitializer

时间:2014-04-29 13:40:22

标签: c# asp.net asp.net-mvc entity-framework

当我开始我的第一个EF时,我在构造函数中使用DbContextDatabase.SetInitializerDropCreateDatabaseAlways<MyDbContext>调用派生类我可以从头开始删除重新创建数据库,但是我跨越迁移,我完全不知道为什么使用迁移超过我的旧方法?我还注意到DropCreateDatabaseAlways<MyDbContext>无效IdentityDbContext我收到错误:The model backing the 'IdentityDb' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

迁移与dbinitializer 如果目的与使用Migration over dbinitializer相同? 也许我正在比较两种不同的东西,但我能说的就是我完全迷失了。

2 个答案:

答案 0 :(得分:4)

DbInitializer从头开始创建该数据库。多数民众赞成。

迁移提供的不仅仅是DbIntitializer。

数据库版本控制

迁移允许您保存对数据库所做的每个更改,存储每个数据库更新,最终创建修订检查点。如果您熟悉,则与源代码控制类似。

您可以向前或向后迁移到特定版本。例如,您可以从版本4(最新)降级到版本2,并且只会丢失已删除的列/表中的数据。

假设您的数据库在版本4中看起来像这样。

Version 4
ID    | FirstName     | LastName
--------------------------------
1     | John          | Smith
2     | Michael       | Smith

版本2没有LastName列,如果您从4迁移到2,则表示您将保留IDFirstName的数据。

Version 2
ID    | FirstName     
-----------------
1     | John          
2     | Michael     

提取Sql脚本

Migration允许您创建升级和降级sql脚本。使用DbInitializer,您如何更新生产数据库?手动?创建一个冰雹玛丽脚本?

使用迁移,如果在部署期间出现问题,部署团队可以轻松降级数据库(不会造成任何损害)

其他数据库注释

通过迁移,您可以自定义数据库的外观。例如:具有默认值的列?迁移让你了解。

数据动作

我认为你的数据库还没有任何必需的初始数据,比如DropDownList选项的项目。使用迁移,您可以自定义更新sql脚本以设置初始数据。例如:国家列表。

另一种情况是移动数据,假设您决定将列名称拆分为FirstName和LastName。

重新开始

当然,Migration允许您从头开始创建数据库,就像DbInitializer一样。

教程: http://msdn.microsoft.com/en-us/data/jj591621

答案 1 :(得分:1)

你说你自己正在删除你的数据库。迁移保留数据。这是一个巨大的优势 - 你当然不想让你的数据库投入生产,我猜想。