控制数据库的位置

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

最新文章

  1. ModelMapper 中高级使用 java
  2. ASP.NET 5系列教程 (一):领读新特性
  3. error C2065: “CMainFrame”: 未声明的标识符
  4. Linux 常见的trouble shooting故障排错
  5. php关联不上mysql解决办法
  6. 一点关于Ajax和一个等待图标的显示
  7. Linq to Entity中连接两个数据库时要注意的问题
  8. Java中如何创建进程(转)
  9. [NOIP2001提高组]数的划分
  10. javaWeb之邮箱发送(邮箱客户端配置)
  11. 2018-2019-2 20165325 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
  12. ArcGIS Pro开发Web3D应用(1)——环境搭建与初始实例
  13. SimpleChannelInboundHandler与ChannelInboundHandlerAdapter
  14. JAVA:IDEA使用Junit(3)
  15. 3分钟学会git命令的基础使用
  16. webpack4对第三方库css,项目全局css和vue内联css文件提取到单独的文件(二十二)
  17. AT3611 Tree MST
  18. web站点健康检测和告警小脚本
  19. Maven 入门——认识Maven结构
  20. JavaScript的进阶之路(四)理解对象1

热门文章

  1. 国内linux 镜像
  2. LeetCode——Invert Binary Tree
  3. 谈谈KV存储集群的设计要点
  4. SSL安装方法二:Windows Server 2008安装SSL证书(IIS 7.5)
  5. mysql存储过程基础示例
  6. netty之LengthFieldBasedFrameDecoder解码器
  7. IDEA 配置
  8. nginx_log介绍和分割
  9. Code Forces 18D Seller Bob(简单DP)
  10. day08:软件系统的体系结构&Tomcat详解&Web应用&http协议