在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型、新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加、删除、修改属性即可。但是修改完成之后要如何将修改同步到数据库中? Entity Framework提供了Migrations机制来解决这一问题。 本文要点: ●启用Migrations 启用Migrations 在VS中的Package Manager Console窗口中选择默认项目为DbContext存在的项目,并执行命令:
然后项目中将生成Migrations目录和Configuration类型:
构造方法:用于对一些Migrations相关的配置,如上代码就是禁用了自动迁移。 注:如过出现以下错误,可把命名空间删除修复:
通过Add-Migration添加Migration 如果已经存在数据库那么需要使用–IgnoreChanges参数来创建一个空的Migration来对应当前的数据库模型:
这时在Migrations目录下会生成一个带时间戳的InitialCreate.cs文件:
注:上面的代码的Up和Down方法之所以为空是因为使用了–IgnoreChanges参数,因为数据库中已经有对应的表和字段,所以不应该再创建一次,如果去掉该参数会生成以下代码:
Update-Database更新数据库 执行Update-Database目录来更新数据库:
这时数据库中多了一个名称为__MigrationsHistory表并有一条记录。
更新模型并添加新的Migration1. 为模型添加一个新的属性"IsPublish"来代表文章是否被公开:
2. 运行Add-Migration命令,名称最好与变更相关用于区分多个Migration便于维护:
执行命令后会生成一个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命令开启迁移,然后在开发中修改完成实体类,就可以调试程序,调试程序过程中自动更新数据库结构。
小结: 对于自动更新数据库以及自动迁移功能,个人不建议在团队开发正式项目时使用,因为使用Add-Migration命令可以很好的追踪数据库结构的更新,并且可以根据情况进行回滚。而自动更新数据库会导致数据库结构改变,团队工作中如果多人使用了同一个数据库并且在代码未同步时会导致错误的出现。
欢迎添加个人微信号:Like若所思。 欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!
|
请发表评论