3.3 使用Code First数据库迁移
当Entity Framework Code First的数据模型发生异动时,默认会引发一个System.InvalidOpertaionException异常。一种解决方法是在Global.asax文档里的Application_Sart方法上,加上一段System.Data.Entity.Database.SetInitializer()方法,让EF自动将数据库删除,然后重新创建模型。
System.Data.Entity.Database.SetInitializer(
new System.Data.Entity.DropCreateDatabaseIfModelChanges<MvcGuestbook.Models.MvcGuestbookContext>());
System.Data.Entity.DropCreateDatabaseIfModelChanges方法的作用是在Model发生改变时,会运行Drop和Create Database等动作。不过,这种将数据库砍掉重建的方式实在过于残暴,应该使用更人性化的方式,让EF帮助我们自动调整数据库架构,并且仍然保留现有数据库中的数据。而这种开发技术就是Code First数据库迁移(DB Migration)。Code First数据库迁移技术,在EF4.3.1版本之后才支持。
在本节的演示中,将用以下数据模型定义示范数据库迁移:
public class Guestbook
{
public int Id { get; set; } [Required]
public string Message { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedOn { get; set; } public virtual Member Member { get; set; }
} public class Member
{
public int Id { get; set; } [Required]
[MaxLength()]
public string Name { get; set; } [MaxLength()]
public string Email { get; set; } public virtual ICollection<Guestbook> Guestbooks { get; set; }
}
另外,在进行本节实验之前,请先将Global.asax中的以下程序代码进行批注:
System.Data.Entity.Database.SetInitializer(
new System.Data.Entity.DropCreateDatabaseIfModelChanges<MvcGuestbook.Models.MvcGuestbookContext>());
EF Code First数据库迁移的方法。
- Enable-Migrations
- Add-Migration Initial
- Update-Database
1. EF Code First如何记录版本
2. 启用数据库迁移
若要在项目中启用数据库迁移功能,必须先开启程序包管理器控制台(Package Manager Console)视图(点击“视图 | 其他窗口 | 程序包管理器控制台”),然后输入Enable-Migrations指令。
PM> Enable-Migrations -ContextTypeName MvcGuestbook.Models.MvcGuestbookContext
运行Enable-Migrations指令的过程中,VS2012会帮助我们在指定的项目里创建一个Migrations目录,该目录下还创建有两个重要的文档,一个是*_InitialCreate.cs文档,另一个是Configuration.cs文档。
3.运行数据库迁移
下面来更改Member数据模型。请新增两个字段:分别是Username与Password属性,定义如下:
public class Member
{
public int Id { get; set; } [Required]
[MaxLength()]
public string Name { get; set; } [MaxLength()]
public string Email { get; set; } [Required]
[MaxLength()]
public string Username { get; set; } [Required]
[MaxLength()]
public string Password { get; set; } public ICollection<Guestbook> Guestbooks { get; set; }
}
我们通过Package Manager Console输入Add-Migration指令,来新增一条数据库迁移版本,输入时必须带上一个“版本名称”参数。例如,要想取名为AddUsernamePassword,则可以输入以下指令:
PM> Add-Migration AddUsernamePassword
运行完成后一样会在Migrations文件夹中再新增一个文件,如图所示。
这次运行Add-Migration指令,所代表的意思就是新增一次运行数据库迁移命令,VS2012会自动对比当前数据库中的Model定义与当前更改过的数据模型,并将差异的字段变化写入这个自动新增的类别内。
每一次新增数据库迁移版本,其类别内都会包含一个Up()方法与Down()方法,所代表的意思分别是“升级数据库”与“降级数据库”的动作,所以数据库迁移不仅仅是将数据库升级,还可以恢复到旧版本。
当前还没有对数据库做任何迁移动作,所以数据库中的数据结构并没有任何改变,为了确认实际情况,可以先手动在Members数据表中输入几条数据,以确认过一会儿数据库迁移之后数据是否消失,如图所示。
接着我们正式对数据库进行迁移动作。请在程序包管理控制台视图中输入指令如下。
PM> Update-Database
更新数据库成功后,你可以再次检查Member数据表结构是否发生变化,还有数据表属性是否仍存在,如图所示。
4.自定义数据库迁移规则
5.自动数据库迁移
Enable-Migrations –EnableAutomaticMigration
对于实体插入操作,直接使用Update-Database
对于实体更新和删除操作,使用
Add-Migration Initial
Update-Database
6.如何避免数据库被自动创建或自动迁移
7.获取Sql脚本
- Update-Database –Script
- Update-Database –Script –SourceMigration:$InitialDatabase –TargetMigration: AddPostAbstract
8. 迁移到特定版本
Update-Database –TargetMigration:ad1
Update-Database –TargetMigration:$InitialDatabase
最新文章
- Android 学习心得 TextView 添加垂直滚动条
- 为何iPhone6 Plus的逻辑分辨率是2208&#215;1242,屏幕实际分辨率却是1920&#215;1080
- latex使用问题总结1
- Nginx开启Gzip压缩
- DB2支持的三种表空间SMS、DMS、DMS的自动存储
- asp.net 柱形图
- shelve模块
- MySQL python组件安装
- 使用Angular 4、Bootstrap 4、TypeScript和ASP.NET Core开发的Apworks框架案例应用:Task List
- jvm系列(十):如何优化Java GC「译」
- 洛谷 P2622 关灯问题II【状压DP;隐式图搜索】
- python基础之Day22
- Java处理Exception无法捕获的异常
- mysql触发器的使用 想让b字段在更新的时候把旧数据保存到a字段中
- js插件开发的一些感想和心得
- c++11 委托构造
- Revit二次开发示例:DeleteDimensions
- MAC命令大全
- ajax 请求 服务器 响应内容过长 返回500错误的解决方法
- Java50道经典习题-程序40 字符串排序
热门文章
- JLINK仿真器与ST-LINK仿真器的安装与配置.pdf
- 达人眼中的WINCE网络驱动
- mysql查询中通配符的使用
- linux 查找替换
- Using Post-Form Trigger In Oracle Forms
- Changing Icon File Of Push Button At Runtime In Oracle Forms 6i
- [HDOJ5723]Abandoned country(最小生成树,期望)
- 美国插画家Mike Bear作品欣赏
- 用@RequestMapping映射请求
- jQuery的.click,.bind,.unbind,.on,.off,.delegate,.undelegate