EF-CodeFirst-数据库初始化
数据库初始化
之前看到Code-First会自动根据域模型创建数据库,下图展示了一个数据库初始化工作流程,该工作流程基于从DbContext派生的上下文类的基础构造函数中传递的参数
如上图所示,上下文类的基础构造函数可以具有以下参数。
1.没有参数
2.数据库名称
3.连接字符串名称
没有参数
如果没有在上下文类的基础构造函数中指定参数,那么它会在本地SQLEXPRESS服务器中创建一个名称与您的{Namespace}。{上下文类名}匹配的数据库
数据库名称
如果指定了数据库名称参数,Code First将使用您在本地SQLEXPRESS数据库服务器的基础构造函数中指定的名称创建一个数据库
ConnectionString名称
在app.config或web.config中定义连接字符串,并在上下文类的基础构造函数中指定以“name =”开头的连接字符串名称;确保providerName = "System.Data.SqlClient"在连接字符串中包含SQL Server数据库
EF提供了四种数据库初始化种策略
策略一:数据库不存在时重新创建数据库(默认策略)
Database.SetInitializer<xxDbContext>(new CreateDatabaseIfNotExists<xxDbContext>());
策略二:每次启动应用程序时创建数据库(如果报错:无法删除数据库XXX,因为该数据库当前正在使用,需要在数据库删除数据库时勾选关闭连接)
Database.SetInitializer<xxDbContext>(new DropCreateDatabaseAlways<xxDbContext>());
策略三:模型更改时重新创建数据库
Database.SetInitializer<xxDbContext>(new DropCreateDatabaseIfModelChanges<xxDbContext>());
自定义数据库初始化程序
Database.SetInitializer<xxDbContext>(null);
看到CreateDatabaseIfNotExists是默认的数据库初始化策略,如果现在更改了域模型,看看会怎么样
因为添加了一个新的域模型,故报错模型已发生更改,这时候将数据库初始化策略改为DropCreateDatabaseIfModelChanges看看

程序成功运行;数据库也被同步更新(但是之前的一条数据却丢失了,这是DropCreateDatabaseIfModelChanges策略是模型发生更改就重建数据库故之前的数据也会被删除;随后看数据迁移会解决这个问题)

至于DropCreateDatabaseAlways策略每次运行应用程序都会重新创建数据库很好理解,最后可以通过
Database.SetInitializer<BaseDbContext>(null);
关闭数据库初始化程序
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
EF-CodeFirst-数据库初始化的更多相关文章
- EF CodeFirst 数据库初始化策略
最近用EF做了几个小东西,了解简单使用后有了深入研究的兴趣,所以想系统的研究一下EF CodeFist的几个要点.下面简单列一下目录 1.1 目录 数据库初始化策略和数据迁移Migration的简单介 ...
- EF CodeFirst 数据库的操作
生成数据库 首先需要通过Nuget安装Migration 这一步是初始化Migration操作. 首先打开程序包控制台, 工具——NuGet包管理器——程序包管理控制台 打开后,在控制台输入下面的命令 ...
- EF CodeFirst系列(2)---CodeFirst的数据库初始化
1. CodeFirst的默认约定 1.领域类和数据库架构的映射约定 在介绍数据库的初始化之前我们需要先了解领域类和数据库之间映射的一些约定.在CodeFirst模式中,约定指的是根据领域类(如Stu ...
- EF CodeFirst系列(9)---添加初始化数据和数据库迁移策略
1.添加初始化数据(Seed) 我们可以在初始化数据库的过程中给数据库添加一些数据.为了实现初始化数据(seed data)我们必须创建一个自定义的数据库初始化器(DB initializer),并重 ...
- 6.翻译系列:EF 6 Code-First中数据库初始化策略(EF 6 Code-First系列)
原文链接:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-firs ...
- EF CodeFirst简介、默认约定、数据库初始化策略
CodeFirst 工作流程 创建或修改领域类-->使用数据注解或者Fluent API来配置领域类-->使用自动数据库迁移技术或者基于代码的数据库迁移技术来创建数据库. CodeFirs ...
- 4.DB Initialization(数据库初始化)[EF Code-First系列]
前面的例子中,我们已经看到了Code-First自动为我们创建数据库的例子. 这里我们将要学习的是,当初始化的时候,Code-First是怎么决定数据库的名字和服务的呢??? 下面的图,解释了这一切! ...
- EF Code-First 学习之旅 数据库初始化
1.CreateDatabaseIfNotExists: 2.DropCreateDatabaseIfModelChanges: 3.DropCreateDatabaseAlways: 4.Custo ...
- EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧 ...
- EF CodeFirst 创建数据库
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 话说EF支持三种模式:Code First M ...
随机推荐
- Forward+ Shading架构
Forward+ = Tile based Light Culling + Tile based Forward Rendering 整体渲染架构分为如下3大步骤: 1.PrePass将场景的min ...
- 【网络】TCP和UDP的区别以及TCP的三次握手四次释放
一.两者区别 1.TCP面向连接的运输层协议,UDP无连接 2.TCP是可靠交付,UDP是尽最大努力交付 3.TCP面向字节流,UDP面向报文 4.TCP是点对点连接的,UDP一对一,一对多,多对多都 ...
- WebRTC信令控制简介与STUN, TURN服务器搭建
本文将向大家介绍两个方面的知识: WebRTC信令控制 STUN/TURN服务器的搭建 在前面的文章中已经向大家介绍了如何构建信令服务器.但构建的信令服务器是如何工作的?哪些消息需要信令服务器控制和中 ...
- Java知多少(49)throw:异常的抛出
到目前为止,你只是获取了被Java运行时系统抛出的异常.然而,程序可以用throw语句抛出明确的异常.Throw语句的通常形式如下: throw ThrowableInstance;这里,Thr ...
- Java知多少(68)面向字符的输出流
面向字符的输出流都是类 Writer 的子类,其类层次结构如图 10-5 所示. 图10-5 Writer的类层次结构图 表 10-3 列出了 Writer 的主要子类及说明. 表 10-3 Writ ...
- 《FPGA全程进阶---实战演练》第七章 让按键恢复平静
1基础理论部分 A:“怎么按键按下去之后,结果不正常?”,B:“按键你消抖了吗?”A:“消什么抖,还要消抖?”, B:“先检测按键变化,然后消抖过滤波动信号,最后输出稳定信号”,A:“我好像漏掉了什 ...
- Error - SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
I find using the following works quite well for SQL min/max dates after many DB related errors: Date ...
- web java -- 连接池 -- 概述
1. 连接池的实现原理 1. 创建连接池 首先要创建一个静态的连接池.这里的“静态”是指池中的连接时在系统初始化时就分配好的,并且不能够随意关闭.Java 提供了很多容器类可用来构建连接池,例如Vec ...
- WPF自定义路由事件(二)
WPF中的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件. 1.WPF内置路由事件 WPF ...
- juypter安装使用
安装: pip install jupyter 启动: jupyter notebook 创建文件 这里的python文件格式是ipynb,可以在download as 中选择要保存的格式. 执行: ...