当我开始我的第一个EF时,我在构造函数中使用DbContext
和Database.SetInitializer
从DropCreateDatabaseAlways<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相同? 也许我正在比较两种不同的东西,但我能说的就是我完全迷失了。
答案 0 :(得分:4)
DbInitializer从头开始创建该数据库。多数民众赞成。
迁移提供的不仅仅是DbIntitializer。
数据库版本控制
迁移允许您保存对数据库所做的每个更改,存储每个数据库更新,最终创建修订检查点。如果您熟悉,则与源代码控制类似。
您可以向前或向后迁移到特定版本。例如,您可以从版本4(最新)降级到版本2,并且只会丢失已删除的列/表中的数据。
假设您的数据库在版本4中看起来像这样。
Version 4
ID | FirstName | LastName
--------------------------------
1 | John | Smith
2 | Michael | Smith
版本2没有LastName
列,如果您从4迁移到2,则表示您将保留ID
和FirstName
的数据。
Version 2
ID | FirstName
-----------------
1 | John
2 | Michael
提取Sql脚本
Migration允许您创建升级和降级sql脚本。使用DbInitializer,您如何更新生产数据库?手动?创建一个冰雹玛丽脚本?
使用迁移,如果在部署期间出现问题,部署团队可以轻松降级数据库(不会造成任何损害)
其他数据库注释
通过迁移,您可以自定义数据库的外观。例如:具有默认值的列?迁移让你了解。
数据动作
我认为你的数据库还没有任何必需的初始数据,比如DropDownList选项的项目。使用迁移,您可以自定义更新sql脚本以设置初始数据。例如:国家列表。
另一种情况是移动数据,假设您决定将列名称拆分为FirstName和LastName。
重新开始
当然,Migration允许您从头开始创建数据库,就像DbInitializer一样。
答案 1 :(得分:1)
你说你自己正在删除你的数据库。迁移保留数据。这是一个巨大的优势 - 你当然不想让你的数据库投入生产,我猜想。