一. 四种初始化策略

  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<dbContext6>(new CreateDatabaseIfNotExists<dbContext6>()); //2. DropCreateDatabaseIfModelChanges (一旦model发生变化,删除数据库重新生成)
//Database.SetInitializer<dbContext6>(new DropCreateDatabaseIfModelChanges<dbContext6>()); //3.DropCreateDatabaseAlways (数据库每次都重新生成)
//Database.SetInitializer<dbContext6>(new DropCreateDatabaseAlways<dbContext6>()); //4. 自定义初始化(继承上面的三种策略中任何一种,然后追加自己的业务)
//Database.SetInitializer<dbContext6>(new MySpecialIntializer()); //5. 禁用数据库策略(不会报错,不会丢失数据,但是改变不了数据库的结构了)
//Database.SetInitializer<dbContext6>(null); } public DbSet<Animal> Animal { get; set; } public DbSet<AnimalKind> AnimalKind { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
} /// <summary>
/// 自定义一个初始化策略,每次初始化时追加10条数据
/// </summary>
public class MySpecialIntializer : DropCreateDatabaseAlways<dbContext6>
{
public override void InitializeDatabase(dbContext6 context)
{
base.InitializeDatabase(context);
} //重写seed,追加初始数据
protected override void Seed(dbContext6 context)
{
for (int i = ; i < ; 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表被删除.

 代码如下:

  internal sealed class Configuration : DbMigrationsConfiguration<dbContext6>
{
public Configuration()
{
AutomaticMigrationsEnabled = true; //启用自动迁移
AutomaticMigrationDataLossAllowed = true; //更改数据库中结构(增加、删除列、修改列、改变列的属性、增加、删除、修改表),需要显示开启。
} }
 public class dbContext6 : DbContext
{ public dbContext6()
: base("name=dbContext6")
{ //数据库迁移配置 //数据库迁移的初始化方式
Database.SetInitializer(new MigrateDatabaseToLatestVersion<dbContext6, Configuration>("dbContext6")); } public DbSet<Animal> Animal { get; set; } public DbSet<AnimalKind> AnimalKind { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
} }

!

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

第十七节: EF的CodeFirst模式的四种初始化策略和通过Migration进行数据的迁移的更多相关文章

  1. 第十六节: EF的CodeFirst模式通过Fluent API修改默认协定

    一. 简介 1. 优先级:Fluent API > data annotations > default conventions. 2. 所有的Fluent API配置都要在 OnMode ...

  2. 第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定

    一. 简介 1. DataAnnotations说明:EF提供以特性的方式添加到 domain classes上,其中包括两类:  A:System.ComponentModel.DataAnnota ...

  3. EF的CodeFirst模式自动迁移(适用于开发环境)

    EF的CodeFirst模式自动迁移(适用于开发环境) 1.开启EF数据迁移功能 NuGet包管理器------>程序包管理控制台---------->Enable-Migrations ...

  4. 第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中 前面我们讲到的elasticsearch( ...

  5. 详解ThinkPHP支持的URL模式有四种普通模式、PATHINFO、REWRITE和兼容模式

    URL模式     URL_MODEL设置 普通模式    0 PATHINFO模式     1 REWRITE模式     2 兼容模式     3 如果你整个应用下面的模块都是采用统一的URL模式 ...

  6. 第四节:Task的启动的四种方式以及Task、TaskFactory的线程等待和线程延续的解决方案

    一. 背景 揭秘: 在前面的章节介绍过,Task出现之前,微软的多线程处理方式有:Thread→ThreadPool→委托的异步调用,虽然也可以基本业务需要的多线程场景,但它们在多个线程的等待处理方面 ...

  7. 2.EF中 Code-First 方式的数据库迁移

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...

  8. 6.翻译系列:EF 6 Code-First中数据库初始化策略(EF 6 Code-First系列)

    原文链接:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-firs ...

  9. 8.翻译系列: EF 6中配置领域类(EF 6 Code-First 系列)

    原文地址:http://www.entityframeworktutorial.net/code-first/configure-classes-in-code-first.aspx EF 6 Cod ...

随机推荐

  1. PE文件格式对定位病毒特征码的作用

    本文主要从杀毒软件查杀病毒的原理出发,分析PE文件格式在杀毒软件定位病毒特征码中的作用.杀毒软件通过快速准确定位病毒特征码,对伪装,隐藏,变种病毒进行查杀. 一.杀毒软件查杀病毒的原理概述 对于操作系 ...

  2. LeetCode算法题-K-diff Pairs in an Array(Java实现)

    这是悦乐书的第254次更新,第267篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第121题(顺位题号是532).给定一个整数数组和一个整数k,您需要找到数组中唯一的k- ...

  3. 简单理解Java的反射

    反射(reflect): JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功 ...

  4. 被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾

    前天, 2018年11月10日, 广州图书馆\微软云开发者社区\广东职业教育信息化研究会\珠三角技术沙龙在广州图书馆负一层1号报告厅搞了一场”微软最有价值专家(MVP)广州分享会 - MonkeyFe ...

  5. 爬虫系列---scrapy post请求、框架组件和下载中间件+boss直聘爬取

    一 Post 请求 在爬虫文件中重写父类的start_requests(self)方法 父类方法源码(Request): def start_requests(self): for url in se ...

  6. 3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(购买域名,域名绑定IP)

    2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据) 因为安全连接是和域名绑在一块的,所以需要申请域名 有没有不知道域名是什么的, ...

  7. 将arguments转换成数组的方法

    将函数里的arguments,转换成一个真正的数组的方法,arguments是个类数组,除了有实参所组成的类似数组以外,还有自己的属性,如callee,arguments.callee就是当前正在执行 ...

  8. codeforces#1132 F. Clear the String(神奇的区间dp)

    题意:给出一个字符串S,|S|<=500.每次操作可以删除一段连续的相同字母的子串.问,最少操作多少次可以把这个字符串变成空串. 分析:刚开始的思路是,把连续的串给删除掉,然后再....贪心.完 ...

  9. sqlalchemy常用

    一.SQLAlchemy 创建表 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Colu ...

  10. Flask —— 信号(5)

    Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为. pip3 install blinker 1. 内置信号 request_started = ...