建设网站分析报告,随意设计一个网站,app下载推广,受欢迎的合肥网站建设一. 四种初始化策略 EF的CodeFirst模式下数据库的初始化有四种策略#xff1a; 1. CreateDatabaseIfNotExists#xff1a;EF的默认策略#xff0c;数据库不存在,生成数据库#xff1b;一旦model发生变化,抛异常#xff0c;提示走数据迁移 2. DropCreateDatabaseIfModelCha…一. 四种初始化策略 EF的CodeFirst模式下数据库的初始化有四种策略 1. CreateDatabaseIfNotExistsEF的默认策略数据库不存在,生成数据库一旦model发生变化,抛异常提示走数据迁移 2. DropCreateDatabaseIfModelChanges一旦model发生变化,删除数据库重新生成 3. DropCreateDatabaseAlways数据库每次都重新生成 4. 自定义初始化(继承上面的三种策略中任何一种然后追加自己的业务) 关闭数据库初始化策略 Database.SetInitializerdbContext6(null); 改变实体类不会报错不会丢失数据但无法映射改变数据库结构了 代码如下 public class dbContext6 : DbContext{public dbContext6(): base(namedbContext6){//在这里可以改变生成数据库的初始化策略//1. CreateDatabaseIfNotExists EF的默认策略数据库不存在,生成数据库一旦model发生变化,抛异常提示走数据迁移)//Database.SetInitializerdbContext6(new CreateDatabaseIfNotExistsdbContext6());//2. DropCreateDatabaseIfModelChanges 一旦model发生变化,删除数据库重新生成//Database.SetInitializerdbContext6(new DropCreateDatabaseIfModelChangesdbContext6());//3.DropCreateDatabaseAlways 数据库每次都重新生成//Database.SetInitializerdbContext6(new DropCreateDatabaseAlwaysdbContext6());//4. 自定义初始化(继承上面的三种策略中任何一种然后追加自己的业务)//Database.SetInitializerdbContext6(new MySpecialIntializer());//5. 禁用数据库策略不会报错不会丢失数据但是改变不了数据库的结构了//Database.SetInitializerdbContext6(null);}public DbSetAnimal Animal { get; set; }public DbSetAnimalKind AnimalKind { get; set; }protected override void OnModelCreating(DbModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);}/// summary/// 自定义一个初始化策略每次初始化时追加10条数据/// /summarypublic class MySpecialIntializer : DropCreateDatabaseAlwaysdbContext6{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 DbSetAnimalKind AnimalKind { get; set; } ,运行代码数据库中AnimalKind表被删除. 代码如下 1 internal sealed class Configuration : DbMigrationsConfigurationdbContext6
2 {
3 public Configuration()
4 {
5 AutomaticMigrationsEnabled true; //启用自动迁移
6 AutomaticMigrationDataLossAllowed true; //更改数据库中结构(增加、删除列、修改列、改变列的属性、增加、删除、修改表),需要显示开启。
7 }
8
9 } 1 public class dbContext6 : DbContext2 {3 4 public dbContext6()5 : base(namedbContext6)6 {7 8 //数据库迁移配置9
10 //数据库迁移的初始化方式
11 Database.SetInitializer(new MigrateDatabaseToLatestVersiondbContext6, Configuration(dbContext6));
12
13
14
15 }
16
17 public DbSetAnimal Animal { get; set; }
18
19 public DbSetAnimalKind AnimalKind { get; set; }
20
21
22 protected override void OnModelCreating(DbModelBuilder modelBuilder)
23 {
24 base.OnModelCreating(modelBuilder);
25 }
26
27 }