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);
}
EF Code First学习笔记:数据库创建的更多相关文章
- EF Code First学习笔记
EF Code First学习笔记 初识Code First EF Code First 学习笔记:约定配置 Entity Framework 复杂类型 Entity Framework 数据生成选项 ...
- EF Code First学习笔记 初识Code First
Code First是Entity Framework提供的一种新的编程模型.通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库. 下面通过一个简单的示例来 ...
- EF Code First学习笔记 初识Code First(转)
Code First是Entity Framework提供的一种新的编程模型.通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库. 下面通过一个简单的示例来 ...
- EF Code First学习笔记:数据库创建(转)
控制数据库的位置 默认情况下,数据库是创建在localhost\SQLEXPRESS服务器上,并且默认的数据库名为命名空间+context类名,例如我们前面的BreakAway.BreakAwayCo ...
- EF Code First 学习笔记:表映射
多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 观察下面两个实体: public class Perso ...
- EF Code First 学习笔记:表映射 多个Entity到一张表和一个Entity到多张表
多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 观察下面两个实体: public class Per ...
- EF Code First 学习笔记:表映射(转)
多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 观察下面两个实体: public class Per ...
- EF Code First 学习笔记:约定配置 Data Annotations+Fluent API
要更改EF中的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面;还有一个就 ...
- EF Code First 学习笔记:关系
一对多关系 项目中最常用到的就是一对多关系了.Code First对一对多关系也有着很好的支持.很多情况下我们都不需要特意的去配置,Code First就能通过一些引用属性.导航属性等检测到模型之 ...
随机推荐
- (转载)Unity3d摄像机Camera参数详解
1. Clear Flags:清除标记.决定屏幕的哪部分将被清除.一般用户使用对台摄像机来描绘不同游戏对象的情况,有3中模式选择: Skybox:天空盒.默认模式.在屏幕中的空白部分将显示当前摄像机的 ...
- 【贪心】 BZOJ 3252:攻略
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 261 Solved: 90[Submit][Status][Discuss] De ...
- API HOOK
API HOOK技术是一种用于改变API执行结果的技术,Microsoft 自身也在Windows操作系统里面使用了这个技术,如Windows兼容模式等. API HOOK 技术并不是计算机病毒专有技 ...
- python常用web框架性能测试(django,flask,bottle,tornado)
测了一下django.flask.bottle.tornado 框架本身最简单的性能.对django的性能完全无语了. django.flask.bottle 均使用gunicorn+gevent启动 ...
- Nagios Apache报Internal Server Error错误的解决方法
今天配置Nagios的时候遇到了一些麻烦,前面的步骤都一切顺利,nagios运行后,可以看到nagios的主页,但点击左边的菜单时总是提示Internal Server Error错误.错误如下: v ...
- lib和dll文件的区别和联系
什么是lib文件,lib和dll的关系如何 (2008-04-18 19:44:37) (1)lib是编译时需要的,dll是运行时需要的. 如果要完成源代码的编译,有lib就够了. 如果也使动态 ...
- tomcat配置301重定向(urlRewrite URL重写)
tomcat默认情况下不带www的域名是不会跳转到带www的域名的,而且也无法像apache那样通过配置.htaccess来实现.如果想要把不带“www'的域名重定向到带”www"域名下,又 ...
- HDU 1422 重温世界杯(DP)
点我看题目 题意 : 中文题不详述. 思路 : 根据题目描述及样例可以看出来,如果你第一个城市选的是生活费减花费大于等于0的时候才可以,最好是多余的,这样接下来的就算是花超了(一定限度内的花超),也可 ...
- 在NEXUS中加入自己定义的第三方PROXIES代理库
就是要等会耐心,更新好之后,才能在PUBLIC库里进行操作. 下图是JBOSS的
- weblogic集群无法启动,提示java.lang.NumberFormatException
我有两台weblogic9.2做的集群A,B,A是主服务器,B是受管服务器,后来通过脚本启动weblogic服务,A服务启动异常,经查后台的日志文件发现报错消息如下: WebLogic Server ...