ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations
在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型、新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加、删除、修改属性即可。但是修改完成之后要如何将修改同步到数据库中?
Entity Framework提供了Migrations机制来解决这一问题。
启用Migrations
在VS中的Package Manager Console窗口中选择默认项目为DbContext存在的项目,并执行命令:
enable-migrations

然后项目中将生成Migrations目录和Configuration类型:


构造方法:用于对一些Migrations相关的配置,如上代码就是禁用了自动迁移。
Seed方法:根据注释可知在迁移后执行,一般用来添加默认数据。Configuration类型可以根据需求进行修改。
注:如过出现以下错误,可把命名空间删除修复:

通过Add-Migration添加Migration
如果已经存在数据库那么需要使用–IgnoreChanges参数来创建一个空的Migration来对应当前的数据库模型:
Add-Migration InitialCreate –IgnoreChanges

这时在Migrations目录下会生成一个带时间戳的InitialCreate.cs文件:

注:上面的代码的Up和Down方法之所以为空是因为使用了–IgnoreChanges参数,因为数据库中已经有对应的表和字段,所以不应该再创建一次,如果去掉该参数会生成以下代码:

Update-Database更新数据库
执行Update-Database目录来更新数据库:
update-database -StartUpProjectName 'My Blog' -ProjectName BlogRepository.MySQL
注:由于本例的DbContext相关类型在BlogRepository.MySQL中,但是连接字符串在My Blog项目中,所以在执行数据库更新时需要指定启动项目和项目名称两个参数。一般情况下使用update-database命令即可。

这时数据库中多了一个名称为__MigrationsHistory表并有一条记录。

更新模型并添加新的Migration
1. 为模型添加一个新的属性"IsPublish"来代表文章是否被公开:
2. 运行Add-Migration命令,名称最好与变更相关用于区分多个Migration便于维护:
add-migration addIsPublishColumn

执行命令后会生成一个DbMigration的子类,该类型中包含一个Up和Down方法,分别对应更新时和回退时对数据库的操作:

上面的Up方法就是为dbo.Posts表添加名为"IsPublish"的列,如果回滚这个Migration时则把该列删除。
3. 再次使用update-database命令将新的变更同步到数据库中:
update-database -StartUpProjectName 'My Blog' -ProjectName BlogRepository.MySQL -Verbose

注:使用参数-Verbose可以看到更多执行信息,包括执行的SQL语句。
启动应用时自动将数据库更新至最新
启动应用时将数据库更新至最新可以省略“update-database”命令执行这一过程,只需要添加了Migration,并且该Migration没有同步到数据库,那么在应用执行(实际上是DbContext在创建模型时OnModelCreating)将会把修改同步到数据库。
1. 添加ClickCount属性:

2. 在DBContext类型中添加OnModelCreating方法及代码(注:该操作也可以通过配置文件配置):

3. 运行程序:

4. 查看结果:

关于Automatic Migrations(自动迁移)
自动迁移指的是在执行“update-database”命令时,将对比实体模型与数据库结构,如果它们有差异则以实体模型为准,将差异同步到数据库。相当于省略了add-migration命令。
在执行启动迁移命令(enable-migrations )时,可以添加参数–EnableAutomaticMigrations或者在生成待Configuration类型的构造方法中将AutomaticMigrationsEnabled的值设为true。

自动更新数据库(migrate database to latest version)与自动迁移(automatic migrations),前者省略“update-database”后者省略“add-migration”,如果一起使用则两者都省略,开发者仅需通过enable-migrations命令开启迁移,然后在开发中修改完成实体类,就可以调试程序,调试程序过程中自动更新数据库结构。
小结:
本章主要是介绍EF的迁移功能,对于EF来说这是一个非常重要的功能,因为在开发过程中特别是code first开发过程中,经常会添加实体、修改实体属性甚至会在使用Fluent API来映射数据库关系的时候也会针对某些属性进行修改,如字段类型、最大长度以及索引等。
对于自动更新数据库以及自动迁移功能,个人不建议在团队开发正式项目时使用,因为使用Add-Migration命令可以很好的追踪数据库结构的更新,并且可以根据情况进行回滚。而自动更新数据库会导致数据库结构改变,团队工作中如果多人使用了同一个数据库并且在代码未同步时会导致错误的出现。
但启用自动迁移并且设置数据库初始化时自动将数据库更新至最新将节省很多操作。各有利弊可根据情况选择。
参考:
https://msdn.microsoft.com/en-us/library/jj591621(v=vs.113).aspx
本文连接:http://www.cnblogs.com/selimsong/p/7656648.html
ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations的更多相关文章
- ASP.NET开发实战——(十二)ASP.NET MVC 与数据库之Entity Framework Migrations
在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型.新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加.删除.修改 ...
- ASP.NET没有魔法——ASP.NET MVC 与数据库大集合
ASP.NET没有魔法——ASP.NET与数据库 ASP.NET没有魔法——ASP.NET MVC 与数据库之MySQL ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM ASP.N ...
- ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM
什么是ORM 对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转 ...
- ASP.NET没有魔法——ASP.NET MVC IoC
之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...
- ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)
上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...
- ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证
随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...
- ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理
ASP.NET MVC的路由是MVC应用的一个核心也是MVC应用处理的入口,作为一个开发者,在正常情况下仅仅需要做的就是根据需求去定义实体.业务逻辑,然后在MVC的Controller中去调用.Vie ...
- ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)
上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...
- ASP.NET没有魔法——ASP.NET MVC Razor与View渲染
对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到 ...
随机推荐
- easyUI创建人员树
最近做了一个树状的下拉列表,在这里记录一下,以后可以直接使用 项目中的树状下拉列表是用来选择人员用的,具体实现展示如下: 先说一说功能,左边的人员数是提供选人的,当点击中间的按钮,选中的人员会直接移到 ...
- 第五次作业2、请将该code进行代码重构,使之模块化,并易于阅读和维护;
1.请运行下面code,指出其功能: (需附运行结果截图,并用简短文字描述其功能) 显示了人的姓名.年龄 2.请将该code进行代码重构,使之模块化,并易于阅读和维护: 3.观看视频The Exper ...
- JAVA基础第四组(5道题)
16.[程序16] 题目:输出9*9口诀. 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列. package com. ...
- 事后诸葛亮分析(Beta阶段)
设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决用户想要随时锻炼四则运算能力的问题:定义的很清楚:有清晰描述. 2.是否有充足的时间来做计划? ...
- 201521123028 《Java程序设计》第8周学习总结
1. 本周学习总结 2. 书面作业 Q1.List中指定元素的删除(题目4-1) 1.1 实验总结 Ans: 在这一题中我们需要写两个函数,分别是remove()和convertStringToLis ...
- 201521123065《java程序设计》第七周学习总结
1. 本周学习总结 1.Iterator迭代器用于遍历集合中的元素: 2.使用迭代器删除元素一定要先指向下一个元素在删除第一个元素: 3.List可以有重复对象: Set不能有重复对象: 4.Map是 ...
- 201521123064 《Java程序设计》第6周学习总结
1. 本章学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...
- 201521123113 《Java程序设计》第2周学习总结
1.本周学习总结 学习了各种java数据类型以及各种运算符的使用 string类之所以好用是因为这是人可以看得懂的类型,操作简便 Scanner扫描器与标准输出输入用法上的不同,Scanner较标准输 ...
- 201521123092《java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...
- Struts2第三篇【Action开发方式、通配符、Struts常量、跳转全局视图、action节点默认配置】
前言 上篇Struts博文已经讲解了Struts的开发步骤以及执行流程了-..对Struts的配置文件有了了解-..本博文继续讲解Struts在配置的时候一些值得要学习的细节- Action开发的三种 ...