EntityFramework :数据库创建
控制数据库的位置
默认情况下,数据库是创建在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);
}
EntityFramework :数据库创建的更多相关文章
- EntityFramework之创建数据库及基本操作(一)
那时学EF的时候还没有Code First,只有DB First,生成的是一个EDMX文件,Code First则没有这文件,下面直接上代码吧 数据库创建以及建表 1.首先我们新建一个新项目,使用Nu ...
- Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解
返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...
- 【EFCore】利用Entityframework Core创建数据库模型
利用Entityframework Core创建数据库模型 本文中Entityframework Core版本为v3.1.6 简介 Entity Framework (EF) Core 是微软轻量化. ...
- 《Entity Framework 6 Recipes》翻译系列 (4) -----第二章 实体数据建模基础之从已存在的数据库创建模型
不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创 ...
- 8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解
本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LI ...
- ASP.NET MVC 如何解决“上下文的模型已在数据库创建后发生更改”问题
问题描述:支持"XXContext"(泛指之类的数据库上下文模型)上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库. 问题解决:坑爹的MVC会 ...
- PowerDesigner的安装和数据库创建(转载)
此文描述详细,特此转载,仅复制了大部分内容,可参考原文CodeSmith和PowerDesigner的安装和数据库创建(原创) 请大家不要用于商业用途哈,要支持正版,大家都是做软件的,知道开发一套软件 ...
- [转]CodeSmith和PowerDesigner的使用安装和数据库创建
最近要忙期考,但还是决定每天抽点空来写CodeSmith的系列文章了,在此实在不敢用教程这个词语,毕竟自己对CodeSmith了解的也不是很多,有很多牛人都在博客园发布了不少关于CodeSmith的文 ...
- Access数据库创建、使用
1.创建Access数据库表 1)在office中打开Microsoft Access2010,选择空数据库创建数据库StudentInfo. 2)创建新表,在表格第一列选择数据类型,并输入列名. 3 ...
- CodeSmith和PowerDesigner的使用安装和数据库创建
原文链接: http://www.cnblogs.com/huangcong/archive/2010/06/14/1757957.html 废话少说,开始我们的CodeSmith旅程吧,我先讲讲这个 ...
随机推荐
- spring-boot 集成 swagger 问题的解决
spring-boot 集成 swagger 网上有许多关于 spring boot 集成 swagger 的教程.按照教程去做,发现无法打开接口界面. 项目由 spring mvc 迁移过来,是一个 ...
- python集成开发eclipse环境安装
1. 安装java7版本以及eclipse 2.安装Pydev 运行Eclipse之后,选择help-->Install new Software->ADD..,如下图所示 http:// ...
- 解决在IE9,IE10浏览器下,程序没有任何错误,easy ui页面不加载任何数据的问题
对于web应用程序,经常用到开发人员工具,按F12,可以调试脚本,可以查看监视网络,查看各页面加载时间,非常方便,今天在调试js时,不小心打开了兼容性视图, 之后每次打打开页面时,均不显示页面post ...
- Linux命令-网络命令:mail
root用户发送邮件 mail wangyunpeng 给wangyunpeng发送邮件,wangyunpeng不在线也可以收到发送的邮件 wangyunpeng用户接收邮件 mail 接收邮件 he ...
- java 虚函数
猜猜这里的代码输出的结果是多少? package test; public class ConstructorExample { static class Foo { int i; Foo() { i ...
- ASDASASD
测试 markdown 随笔 asdsdf sdf
- Angularjs promise-$q服务详解
var ngApp=angular.module('ngApp',[]); /************************************************************* ...
- 关于scut在unity上的主动推送
自带的samples里面,chat的例子涉及主动推送,可作为参考. 在unity里面接收主动推送用Net.CommonCallback 服务端最近的新版本更改了接口,有两种方法推送: ActionFa ...
- vivado sdk生成elf文件出错:make: Interrupt/Exception caught (code = 0xc00000fd, addr = 0x4227d3)
vivado sdk生成elf文件出错:make: Interrupt/Exception caught (code = 0xc00000fd, addr = 0x4227d3) Might be a ...
- 日志分析工具--GoAccess的安装部署
需求:及时得到线上用户访问日志分析统计结果,以便给开发.测试.运维.运营人员提供决策! 方案:GoAccess,图文并茂,而且速度快,每秒8W 的日志记录解析速度,websocket10秒刷新统计数据 ...