博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF Code First学习笔记:数据库创建
阅读量:5991 次
发布时间:2019-06-20

本文共 4080 字,大约阅读时间需要 13 分钟。

控制数据库的位置

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

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

利用配置文件

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

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

改为BreakAwayConfigFile。

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

新建的连接串名称和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
()); using (var context = new BreakAwayContext()) { context.Database.Initialize(true); }

2 DropCreateDatabaseIfModelChanges

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

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

3 DropCreateDatabaseAlways

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

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

 

 

如果我的文章对你有帮助,就点一下推荐吧.(*^__^*)

转载地址:http://rjtlx.baihongyu.com/

你可能感兴趣的文章
存储过程,触发器,游标
查看>>
php.ini中allow_call_time_pass_reference参数的意思
查看>>
object references an unsaved transient instance - save the transient instance before flushing
查看>>
iPhone控件之UIWebView2
查看>>
Windows Phone SDK 7.1.1 Update正式版发布
查看>>
.net1.0--4.0
查看>>
webkit webApp 开发技术要点总结
查看>>
File的renameTo操作备忘
查看>>
转C++日志库log4cplus使用手册
查看>>
jQuery-插件-图片切换(第一次自已偿试写插件)
查看>>
JavaScript之构造函数初了解
查看>>
Linux文件的复制、删除和移动命令
查看>>
[原创]FineUI秘密花园(二十一) — 表格之动态创建列
查看>>
PowerDesigner(PowerDesigner15.1.0.2850)下载、安装以及破解
查看>>
Java代码输出是“father”还是“child”(二)
查看>>
396种编程开发语言
查看>>
nil、Nil、NULL和NSNull的理解
查看>>
第十二章 springboot + mongodb(复杂查询)
查看>>
微信和WeChat的合并月活跃账户数达到7.62亿了
查看>>
Lintcode--009(单词切分)
查看>>