zoukankan      html  css  js  c++  java
  • 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;">

  • 相关阅读:
    NoSuchMethodError 一般是jar包冲突了
    联通网络环境上无法访问http://repo1.maven.org/maven2/中央库解决,镜像库添加
    实现MySQL数据库的实时备份
    海外支付:遍布全球的Paypal
    .Net分布式缓存应用实例:Couchbase
    海外支付:抵御信用卡欺诈的CyberSource
    那些年,我们开发的接口之:QQ登录(OAuth2.0)
    ES6知识整理(一)--- let/const/箭头函数
    webpack 热更新(实施同步刷新)
    Vue状态管理vuex
  • 原文地址:https://www.cnblogs.com/GnailGnepGnaw/p/9167477.html
Copyright © 2011-2022 走看看