控制数据库的位置

默认情况下,数据库是创建在localhost\SQLEXPRESS服务器上,并且默认的数据库名为命名空间+context类名,例如我们前面的BreakAway.BreakAwayContext。

有几种方法可以改变这种默认约定。

利用配置文件

在配置文件中新加一个连接字符串

  <connectionStrings><add name="BreakAwayContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=BreakAwayConfigFile;Trusted_Connection=true" /></connectionStrings>

注意这里连接字符串名称和我们的context类名相同,都为BreakAwayContext。我们修改了一下默认的数据库名,将BreakAway.BreakAwayContext

改为BreakAwayConfigFile。

我们在新增一个连接字符串

<connectionStrings><!--<add name="BreakAwayContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=BreakAwayConfigFile;Trusted_Connection=true" />--><add name="My_Test" providerName="System.Data.SqlClient" connectionString="Server=.;Database=MyBreakAwayDb;Trusted_Connection=true" /></connectionStrings>

新建的连接串名称和context类名不同了,所以我们要在BreakAwayContext的构造函数中指名连接串的名称:

 public class BreakAwayContext : DbContext{public BreakAwayContext():base("name=My_Test"){}} 

利用DbConnection

DbContext有一个带DbConnection重载的构造函数,说明我们也可以通过DbConnection来定位数据库位置。我们也要先修改BreakAwayContext的构造函数:

         public BreakAwayContext(DbConnection connection): base(connection, contextOwnsConnection: false){ }

调用:

        static void Main(string[] args){try{var lodging = new Lodging{Name = "Rainy Day Motel",};var resort = new Resort{Name = "Top Notch Resort and Spa",MilesFromNearestAirport = 30,Activities = "Spa, Hiking, Skiing, Ballooning",};var cstr = @"Server=.\SQLEXPRESS; Database=BreakAwayDbConnectionConstructor;Trusted_Connection=true";using (var connection = new SqlConnection(cstr)){using (var context = new BreakAwayContext(connection)){context.Lodgings.Add(lodging);context.SaveChanges();}}}catch (System.Data.Entity.Validation.DbEntityValidationException ex){Console.WriteLine( " 保存失败");}Console.WriteLine("OK");Console.Read();}

使用连接工厂控制数据库位置

Code First的默认连接工厂是SqlConnectionFactory。此连接工厂将使用SQL Client(System.Data.SqlClient的)数据库引擎连接到数据库。默认的行为,将选择在localhost\ SQLEXPRESS创建数据库,并使用上下文类型的完全限定名作为数据库的名称。
我们可以通过指定的连接字符串段,来覆写默认规则。

 static void Main(string[] args){try{Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Server=.;Trusted_Connection=true");using (var context = new BreakAwayContext()){context.Database.Initialize(true);context.SaveChanges();}}catch (System.Data.Entity.Validation.DbEntityValidationException ex){              Console.WriteLine( " 保存失败");}Console.WriteLine("OK");Console.Read();}

PS:用这个方法好像没办法指定数据库名,默认名称为context类的完全限定名。

数据库初始化

初始化包括两个主要步骤。首先,使用Code First在内存中根据默认规则和配置创建模型。其次,使用已设置的数据库初始化器将用于存储数据的数据库初始化。

初始化是延迟加载的,所以创建一个实例的是不完全满足初始化发生的条件的。必须执行对模型的操作,如查询或添加实体才会发生。

但我们可以可以调用DbContext.Database.Initialize方法,在没有对模型执行任何操作的时候强制初始化。

             using (var context = new BreakAwayContext()){context.Database.Initialize(true);}

在数据库初始化产生时进行控制

有三个方法可以控制数据库初始化时的行为。

1 CreateDatabaseIfNotExists

CreateDatabaseIfNotExists方法会在没有数据库时创建一个,这是默认行为。

                Database.SetInitializer( new CreateDatabaseIfNotExists<BreakAwayContext>());using (var context = new BreakAwayContext()){context.Database.Initialize(true);}

2 DropCreateDatabaseIfModelChanges

如果我们在在模型改变时,自动重新创建一个新的数据库,就可以用这个方法。在这开发过程中非常有用。

                Database.SetInitializer(new DropCreateDatabaseIfModelChanges<BreakAwayContext>());using (var context = new BreakAwayContext()){context.Database.Initialize(true);}

3 DropCreateDatabaseAlways

如果你想在每次运行时都重新生成数据库就可以用这个方法。

                Database.SetInitializer(new DropCreateDatabaseAlways<BreakAwayContext>());using (var context = new BreakAwayContext()){context.Database.Initialize(true);}

转自:http://www.cnblogs.com/Gyoung/archive/2013/01/28/2876845.html

转载于:https://www.cnblogs.com/ITGirl00/p/3533567.html

EF Code First学习笔记:数据库创建(转)相关推荐

  1. EF Code First 学习笔记:关系

    一对多关系 项目中最常用到的就是一对多关系了.Code First对一对多关系也有着很好的支持.很多情况下我们都不需要特意的去配置,Code First就能通过一些引用属性.导航属性等检测到模型之间的 ...

  2. EF Code First 学习笔记:关系(转)

      一对多关系 项目中最常用到的就是一对多关系了.Code First对一对多关系也有着很好的支持.很多情况下我们都不需要特意的去配置,Code First就能通过一些引用属性.导航属性等检测到模型之 ...

  3. EF Code First 学习笔记:约定配置

    要更改EF中的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面;还有一个就 ...

  4. Django:学习笔记(2)——创建第一个应用

    Django:学习笔记(2)--创建第一个应用 创建应用 在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定.Django 自带一个工具,可以帮你生成应用的基础目录结构, ...

  5. oracle 创建角色 权限设置,[学习笔记] Oracle创建用户、分配权限、设置角色,

    [学习笔记] Oracle创建用户.分配权限.设置角色, 创建用户 create user student --用户名 identified by "123456" --密码 de ...

  6. spring学习笔记02-spring-bean创建的细节问题

    spring学习笔记02-spring-bean创建的细节问题 三种创建Bean对象的方式 Bean的作用范围 Bean的生命周期 <?xml version="1.0" e ...

  7. JavaScript学习笔记:创建、添加与删除节点

    JavaScript学习笔记:创建.添加与删除节点 文章目录 JavaScript学习笔记:创建.添加与删除节点 一.DOM对象节点类型 二.创建节点 1.创建元素节点 2.创建文本节点 3.创建属性 ...

  8. Python学习笔记:创建分数类

    Python学习笔记:创建分数类 1.编写创建分数类.py # 创建分数类from math import gcd# 定义分数类 class Fraction: def __init__(self, ...

  9. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

最新文章

  1. (原)War3 脚本分析5-基础脚本资源
  2. 制作血条_unity-UGUI如何制作血条
  3. 【Android 应用开发】View 与 SurfaceView 区别
  4. NLP高阶实战必读:一文走遍完整自然语言处理流程
  5. axios在IE下的兼容性处理
  6. 电话骗术升级了,提高警惕! (转自公司内部新闻组,真人真事)
  7. 前端学习(502):水平居中布局得第三种方式
  8. 交易软件 python_Python实现银行账户资金交易管理系统
  9. Xamarin devexpress Grid
  10. ECSHOP图书销售网站模板
  11. TV_Control Android机顶盒手机控制全套程序开源
  12. BZOJ 3689: 异或之 可持久化trie+堆
  13. 实验一 数据库、表的创建与维护
  14. 开发管理---项目的范围、时间与成本
  15. WEB安全(十六)单点登录的基本实现
  16. 黎曼和 Riemann Sum ,黎曼积分Riemann Integral,正态分布normal distribution
  17. gitHub 代码从fork到push
  18. 201908个人笔记
  19. 微信小程序基于腾讯云对象存储的图片上传
  20. 七牛 - 网络资源上传文件

热门文章

  1. android 实现SSL握手协商
  2. Asp.net mvc 知多少(六)
  3. Django框架基础学习
  4. 《Git权威指南》笔记2
  5. 牛刀小试Oracle之ORACLE 11GR2 RAC安装配置--检测GI软件是否正常(三)
  6. ReactiveCocoa源码拆分解析(四)
  7. C++的常量折叠(一)
  8. java-多线程-一道阿里面试题分析
  9. WebView 和JS 之间交互
  10. Android.自定义控件的实现 (转载)