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

一. 四种初始化策略

  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 = 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<dbContext6>
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("name=dbContext6")6         {7  8             //数据库迁移配置9 
10             //数据库迁移的初始化方式
11             Database.SetInitializer(new MigrateDatabaseToLatestVersion<dbContext6, Configuration>("dbContext6"));
12 
13 
14 
15         }
16 
17         public DbSet<Animal> Animal { get; set; }
18 
19         public DbSet<AnimalKind> AnimalKind { get; set; }
20 
21 
22         protected override void OnModelCreating(DbModelBuilder modelBuilder)
23         {
24             base.OnModelCreating(modelBuilder);
25         }
26 
27     }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux笔记本不关机直接合上,笔记本电脑不关机直接合上行吗

可以。笔记本电脑将盖子合住&#xff0c;对电脑是没有损害&#xff0c;系统的默认设置是合上盖子后电脑处于待机状态。这时电脑的大部分硬件都已经关闭&#xff0c;只有个别硬件为了唤醒计算机仍在运行&#xff0c;但都是低功耗&#xff0c;不浪费电&#xff0c;也不会加快计算…

第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法

一. 简介 该章节&#xff0c;可以说是一个简单轻松的章节&#xff0c;只要你对Expression表达式树、EF的基本使用、泛型有所了解&#xff0c;那么本章节实质上就是一个非常简单的封装章节&#xff0c;便于我们快捷开发。 PS&#xff1a;在该章节对于EF的上下文怎么处理&#xf…

115网盘linux 下载速度慢,linux vps 上 下载115网盘 的方法

大多数童鞋买的vps都是只支持linux系统的&#xff0c;因为版权的问题&#xff0c;windows系统的vps价格上面要贵一些。但是&#xff0c;遇到要下载网盘文件时&#xff0c;没有装桌面只有shell的linux vps就表示压力大了&#xff0c;幸好LV发现一个Linux vps下载115网盘的方法&a…

第二十节: 深入理解并发机制以及解决方案(锁机制、EF自有机制、队列模式等)

一. 理解并发机制 1. 什么是并发&#xff0c;并发与多线程有什么关系&#xff1f; ①. 先从广义上来说&#xff0c;或者从实际场景上来说. 高并发通常是海量用户同时访问(比如&#xff1a;12306买票、淘宝的双十一抢购)&#xff0c;如果把一个用户看做一个线程的话那么并发可…

利用指针编程实现:删除一个字符串中的所有空格 c语言,C语言必考100题解析汇报...

1.按下述格式&#xff0c;从键盘输入一个整数加法表达式&#xff1a;操作数1操作数2&#xff0c;然后计算并输出表达式的计算结果&#xff0c;形式如下&#xff1a;操作数1操作数2计算结果。2.输入两个整形数并打印&#xff0c;如果用户不慎输入了非法字符&#xff0c;那么程序…

第二十一节:ADO层次上的海量数据处理方案(SqlBulkCopy类插入和更新)

一. 简介 1. 背景&#xff1a; 虽然前面EF的扩展插件Z.EntityFramework.Extensions&#xff0c;性能很快&#xff0c;而且也很方便&#xff0c;但是该插件要收费&#xff0c;使用免费版本的话&#xff0c;需要定期更新&#xff0c;如果不更新&#xff0c;将失效&#xff0c;非…

c语言程序设计慕课版答案第6章,C语言程序设计答案黄保和编第6章函数.doc

一、思考题1、函数总需要从main中调用吗&#xff1f;当调用一个函数时&#xff0c;为什么要使用参数&#xff1f;函数不是总需要从main函数中调用&#xff0c;使用参数的目的是为了给被调函数传递数据。2、什么是函数的返回值&#xff1f;是否每个函数都有返回值&#xff1f;为…

c语言程序设计答案万年历备忘录,基于JavaScript(网页脚本语言)编写的万年历(含源文件)...

var i, sum 348for(i0x8000; i>0x8; i>>1) sum (lunarInfo[y-1900] & i)? 1: 0return(sumleapDays(y))}// 传回农历y年闰月的天数function leapDays(y) {if(leapMonth(y)) return((lunarInfo[y-1900] & 0x10000)? 30: 29)else return(0)}// 传回农历y年闰…

第二十二节: 以SQLServer为例介绍数据库自有的锁机制(共享锁、更新锁、排它锁等)和事务隔离级别 :

一. 基本概念 1.共享锁&#xff1a;(holdlock) (1). select的时候会自动加上共享锁&#xff0c;该条语句执行完&#xff0c;共享锁立即释放&#xff0c;与事务是否提交没有关系。 (2). 显式通过添加(holdlock)来显式添加共享锁&#xff08;比如给select语句显式添加共享锁&…

r语言中1c0怎么表示什么,r语言表示或者用什么符号?

犯罪嫌疑人X1、对象名称中的句点(.)没有特殊意义。但美元符号($)却有着和其他语言中的句点类似的含义&#xff0c;即指定一个对象中的某些部分例如&#xff1a;(1)A$x是指数据框A中的变量x。(2)lm.x 指一个变量&#xff0c;lm$x则指对象lm的一个属性。2、 R不提供多行注释或块注…

第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题

一. 开篇说明 EF的性能问题一直以来经常被人所吐槽&#xff0c;究其原因在于“复杂的操作在生成SQL阶段耗时长&#xff0c;且执行效率不高”&#xff0c;但并不是没有办法解决&#xff0c;从EF本身举几个简单的优化例子&#xff1a; ①&#xff1a;如果仅是查询数据&#xff0c…

c语言怎样计算栈的长度,数据结构与算法:栈 C语言实现

栈是仅在表尾进行插入、删除操作的线性表。即栈 S (a1, a2, a3, ………,an-1, an)&#xff0c;其中表尾称为栈顶 /top&#xff0c;表头称为栈底/base。由于只能在表尾进行操作&#xff0c;因此栈的运算规则就是“后进先出”(LIFO)和线性表类似&#xff0c;栈也有两种存储结构—…

WebApi系列(从.Net 到 .Net Core)【更新】

一. 简介 1. 什么是WebApi&#xff1f; WebApi是一个很广泛的概念&#xff0c;在这里我们特指.Net平台下的Asp.Net WebApi框架&#xff0c;它是针对各种客户端(浏览器、APP等)来构建Http服务的一个框架&#xff0c;它是一种RestFul风格的开发接口的技术&#xff0c;它比WebServ…

c语言 有趣的代码,分享一段有趣的小代码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include//数字雨typedef struct{int x, y;char ch;}STU;STU st[5000];//出现位置void gotoxy(int x, int y){HANDLE hout;COORD pos;pos.X x;pos.Y y;hout GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorP…

第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍

一. 原生态接口 1. 从默认路由开始分析 在WebApiConfig.cs类中的Register方法中&#xff0c;我们可以看到默认路由如下&#xff1a; 分析&#xff1a;请求地址在 controller 前面需要加上 api/&#xff0c;controller后面没有action&#xff0c;最后有一个参数{id}&#xff0c…

复数抽象数据类型C语言,采用C/C++语言如何实现复数抽象数据类型Complex

记录一下&#xff01;采用C/C语言如何实现复数抽象数据类型Complex#include typedef struct Complex{double e1; // 实部double e2; // 虚部}COMPLEX;// 函数声明COMPLEX AssignComplex(double v1, double v2);void DestroyComplex(COMPLEX pc);double GetReal(COMPLEX pc);dou…

第二节:如何正确使用WebApi和使用过程中的一些坑

一. 基本调用规则 1. 前提 WebApi的默认路由规则为&#xff1a;routeTemplate: "api/{controller}/{id}", 下面为我们统一将它改为 routeTemplate: "api/{controller}/{action}/{id}",这样我们在调用的时候&#xff0c;还是通过拼接方法名来识别&#xff0…

android 新闻功能列表,android根据提供的接口获取新闻列表

查询新闻列表&#xff1a;接口名称&#xff1a;GetNewsInfo接口参数&#xff1a;(string account(账号), string pwd(密码),string newstype(新闻类型[图文新闻(传入4)&#xff0c;图片链接(传入3)])string showArea(显示区域类型[首页(传入1)&#xff0c;监护页面(传入2)])str…

第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)

一. 前言 前端调用有Form表单提交&#xff0c;ajax提交&#xff0c;ajax一般是用Jquery的简化写法&#xff0c;在这里不再过多介绍&#xff1b; 后端调用大约有这些&#xff1a;WebCient、WebRequest、Httpclient、WebapiClient&#xff0c;重点探讨Get和Post请求&#xff0c;P…

android 传感器ceshi,Android代码-传感器-测试手机支持那几种传感

Android代码----传感器-----测试手机支持那几种传感一个小小Demo检测手机支持那几种传感&#xff1a;具体代码如下&#xff1a;[Java代码]DemoSensorActivity.javapackage com.example.testsensor;import java.util.List;import android.app.Activity;import android.content.C…