博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第十七节: EF的CodeFirst模式的四种初始化策略和通过Migration进行数据的迁移
阅读量:6201 次
发布时间:2019-06-21

本文共 3725 字,大约阅读时间需要 12 分钟。

一. 四种初始化策略

  EF的CodeFirst模式下数据库的初始化有四种策略:

   1. CreateDatabaseIfNotExists:EF的默认策略,数据库不存在,生成数据库;一旦model发生变化,抛异常,提示走数据迁移

   2. DropCreateDatabaseIfModelChanges:一旦model发生变化,删除数据库重新生成

   3. DropCreateDatabaseAlways:数据库每次都重新生成

   4. 自定义初始化(继承上面的三种策略中任何一种,然后追加自己的业务)

 关闭数据库初始化策略:

  Database.SetInitializer<dbContext6>(null);   (改变实体类,不会报错,不会丢失数据,但无法映射改变数据库结构了)

  代码如下:

 

public class dbContext6 : DbContext    {        public dbContext6()            : base("name=dbContext6")        {            //在这里可以改变生成数据库的初始化策略            //1. CreateDatabaseIfNotExists (EF的默认策略,数据库不存在,生成数据库;一旦model发生变化,抛异常,提示走数据迁移)            //Database.SetInitializer
(new CreateDatabaseIfNotExists
()); //2. DropCreateDatabaseIfModelChanges (一旦model发生变化,删除数据库重新生成) //Database.SetInitializer
(new DropCreateDatabaseIfModelChanges
()); //3.DropCreateDatabaseAlways (数据库每次都重新生成) //Database.SetInitializer
(new DropCreateDatabaseAlways
()); //4. 自定义初始化(继承上面的三种策略中任何一种,然后追加自己的业务) //Database.SetInitializer
(new MySpecialIntializer()); //5. 禁用数据库策略(不会报错,不会丢失数据,但是改变不了数据库的结构了) //Database.SetInitializer
(null); } public DbSet
Animal { get; set; } public DbSet
AnimalKind { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } ///
/// 自定义一个初始化策略,每次初始化时追加10条数据 /// public class MySpecialIntializer : DropCreateDatabaseAlways
{ public override void InitializeDatabase(dbContext6 context) { base.InitializeDatabase(context); } //重写seed,追加初始数据 protected override void Seed(dbContext6 context) { for (int i = 0; i < 10; i++) { context.Animal.Add(new Animal() { id = "animal" + i, animalName = "mru" + i, animalKind = "mruru" + i, }); } context.SaveChanges(); base.Seed(context); } } }

 

  总结:以上四种初始化策略,让我们知道了上一个章节中,为什么数据库结构发生变化就会抛异常,但是无论哪种方式,还是没有解决数据丢失的问题,解决数据丢失问题,详见:数据迁移。

 

二. 数据迁移(代码的形式非指令)

   数据迁移很好的解决了修改表结构,数据丢失的问题,在本章节介绍通过代码的形式处理数据迁移问题,指令控制的形式,在后面章节介绍。

   步骤:

  ①:新建Configuration.cs类,在其构造函数中进行相关配置。

  ②:改变数据库的初始化策略为,MigrateDatabaseToLatestVersion ,并在Configuration类中配置开启自动迁移:AutomaticMigrationsEnabled = true; 

  ③:显式开启允许修改表结构:AutomaticMigrationDataLossAllowed = true;   (默认是关闭的)

 进行测试:

   ① 增加一列:改变Animal类,增加一个字段,刷新数据库,发现数据多了一列 (无需特别的配置),但后面再次增加,还是需要配置AutomaticMigrationDataLossAllowed设置为true

   ② 删除一列、修改列、改变列的属性:报错,提示需要将AutomaticMigrationDataLossAllowed设置为true, 设置后,修改或删除成功。

   ③ 增加一张表:增加一个AnimalKind类,运行代码,发现数据库多了一张表。

   ④ 删除表:注释掉:public DbSet<AnimalKind> AnimalKind { get; set; } ,运行代码,数据库中AnimalKind表被删除.

  代码如下:

 

1  internal sealed class Configuration : DbMigrationsConfiguration
2 {3 public Configuration()4 {5 AutomaticMigrationsEnabled = true; //启用自动迁移6 AutomaticMigrationDataLossAllowed = true; //更改数据库中结构(增加、删除列、修改列、改变列的属性、增加、删除、修改表),需要显示开启。7 }8 9 }

 

1 public class dbContext6 : DbContext 2     { 3  4         public dbContext6() 5             : base("name=dbContext6") 6         { 7   8             //数据库迁移配置 9 10             //数据库迁移的初始化方式11             Database.SetInitializer(new MigrateDatabaseToLatestVersion
("dbContext6"));12 13 14 15 }16 17 public DbSet
Animal { get; set; }18 19 public DbSet
AnimalKind { get; set; }20 21 22 protected override void OnModelCreating(DbModelBuilder modelBuilder)23 {24 base.OnModelCreating(modelBuilder);25 }26 27 }

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 :
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

 

转载于:https://www.cnblogs.com/yaopengfei/p/7820024.html

你可能感兴趣的文章
SpringBoot学习之集成dubbo
查看>>
上海临港澄清与特斯拉并未接触,后者落地上海就是一个“乌龙”
查看>>
我面试过的那些烂技术大哥
查看>>
第145天:jQuery.touchSlider触屏满屏左右滚动幻灯片
查看>>
如何用 CSS 修出好看的照片
查看>>
乐视,你敢做VR直播吗?
查看>>
Parrot 4.6 发布,基于 Debian 的 Linux 发行版
查看>>
Linux下的echo输出换行符
查看>>
SoJpt Boot 2.3-3.8 发布,Spring Boot 使用 Jfinal 特性极速开发
查看>>
银行与区块链的结合:已经克服的挑战
查看>>
区块链101:公开和许可的区块链有什么区别?
查看>>
VR领域迎来大量融资,但智能硬件企业依然生存存疑
查看>>
网宿科技祭出杀手锏已发现云服务商致命弱点
查看>>
【观点】CFTC主席Giancarlo:支持区块链符合“国家利益”
查看>>
【钛坦白】傲游创始人陈明杰 :区块链项目投资的三板斧
查看>>
Spring MVC-处理程序映射(Handler Mapping)-控制器类名称处理程序映射(Controller Class Name Handler Mapping)示例(转载实践)...
查看>>
效益最大化,SpaceX有望在明年实现火箭组件的完全重复利用
查看>>
【AI科幻】地球陨落 · 暴风雨前的宁静
查看>>
助力企业智能化进程 深智云让一切皆有可能
查看>>
AI的存在不是威胁 真正的威胁是没有正确使用AI
查看>>