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

 

控制数据库的位置

默认情况下,数据库是创建在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

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

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

相关文章

ASP.NET 2.0+Atlas编写鼠标拖放程序

作者&#xff1a;朱先忠编译摘要 本文将详细探讨Atlas中的声明性编程与强制性编程之间的关系&#xff0c;及如何用之在一个web客户端实现拖放功能。下图为本文相应示例程序运行结果快照。运行结果一. 简介  本文旨在帮助读者理 解微软的Atlas技术的某些方面的工作原理。Atlas…

疑难杂症--由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作

在巡检数据库时发现&#xff0c;数据库备份作业失败&#xff0c;查看错误日志发现以下提示&#xff1a; 已以用户 WIN2008-JH122\SYSTEM 的身份执行。 Microsoft (R) SQL Server 执行包实用工具 Version 10.0.4000.0 for 64-bit 版权所有 (C) Microsoft Corp 1984-2005。保留…

call_once/once_flag的使用

call_once/once_flag的使用 保证在多线程环境中某个函数仅仅被调用一次,可以使用std::call_once函数,并且需要一个入参once_flag类型的入参 #include<iostream> #include <string> #include <tuple> #include <mutex> #include <thread> #incl…

算法基础系列之三:螺旋形矩阵

如何打印出如下这样的螺旋形的矩阵&#xff1a; 1 2 3 8 9 4 7 6 5 方法一&#xff1a; static void SpiralMatrix(int count) { int[,] iarray new int[count, count]; for (int i 0; i < count; i) { for (int j 0; j < count; j) { iarray[i, j] 0…

C++11异步操作

C11异步操作 C 11 提供了异步操作相关的类,主要有std::future std::promise std::package_task std::future作为异步结果的传输通道,获取线程函数的返回值; std::promise用来包装一个值,将数据和std::future绑定; std::package用来包装一个对象,将数据和future绑定起来,以方…

GDI对象的初始化

GDI对象的初始化 一、GR_GraphicsFactory对象的初始化在XAP_App对象的构造函数中创建GR_GraphicsFactory对象。在XAP_Win32App构造函数中&#xff0c;调用GR_GraphicsFactory对象的registerClass函数初始化m_vAllocators、m_vDescriptors、m_vClassIds集合成员变量&#xff0c;…

存储过程从入门到熟练(多个存储过程完整实例及调用方法)_AX

①为什么要使用存储过程?因为它比SQL语句执行快.②存储过程是什么?把一堆SQL语句罗在一起,还可以根据条件执行不通SQL语句.(AX写作本文时观点)③来一个最简单的存储过程CREATE PROCEDURE dbo.testProcedure_AXASselect userID from USERS order by userid desc注:dbo.testPro…

Abiword中字符操作

Abiword中字符操作 一、关于不同字符的宏定义 typedef gunichar UT_UCS4Char;typedef guint16 UT_UCS2Char;typedef UT_UCS4Char UT_UCSChar; /* Unicode */ typedef guint32 gunichar;typedef guint16 gunichar2; AbiWord is now fully converted to using 32-bi…

C++ 11线程池 ThreadPool

线程池 ThreadPool 半同步半异步线程池(简略版)C11实现,详细解析 同步队列 SynchronousQueue.hpp #include <list> #include <mutex> #include <thread> #include <condition_variable> #include <iostream> using namespace std;template&l…

ITPro Magazine2006年第6期发布

下载地址[url]http://www.cnfan.net/magazine/itpromagazine200606.rar[/url]主题企划Windows Fundamentals For Legacy PCs深度解析&#xff1a;Windows Vista RC1的五大特性系统应用Win2003平台php环境架设Xen3安装及使用(On Fedora core5)ISA Server 2004 ***应用网络与安全…

abiword class list

Class List【转自官方文档】 Here are the classes, structs, unions and interfaces with brief descriptions:GR_CharWidths::_a _AbiCellRendererFont _AbiCellRendererFontClass _AbiControlGUI _AbiFontCombo _AbiFontComboClass _AbiPrivData _AbiTable _AbiWidget _AbiW…

网络资源的初始化与释放(C++ RAII惯用法)

1. 网络资源的初始化与释放(C RAII惯用法) C RAII 惯用法 RAII (Resource Acquisition Is Initialization)资源获取即初始化 我们拿到资源的时候就已经初始化,一旦不需要该资源,该资源就会被释放 资源: 在 C 的语境下&#xff0c;资源代表一些可以必须先被获取才能使用的对…

美国Palmbeach大学服务器整合改造案例

位于美国佛罗里达州的palmbeach大学&#xff0c;有4万9千多在校学生和2000多名教工。据学校的信息主管t parziale介绍&#xff0c;目前学校正在进行一个投资160多万美元的关于信息中心服务器、存储、网络等3部分整合改造并简化管理的项目。 该项目主要改造内容是&#xff1a;用…

避免switch嵌套的一种方法

避免switch嵌套的一种方法 DWORD nFlags 0;switch (mouse.nButton){case 0: //左键nFlags 1;case 1: //右键nFlags 2;break;case 2: //中间nFlags 4;break;case 4:nFlags 8;break;}if (nFlags ! 8)SetCursorPos(mouse.ptXY.x, mouse.ptXY.y);switch (mouse.nAction){case…