EF Codefirst生成数据库的三种方式
Posted 为了暖宝宝的幸福生活而奋斗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF Codefirst生成数据库的三种方式相关的知识,希望对你有一定的参考价值。
1、写在前头
不是什么高大上的东西,也不是完全原创的,大多是自己学习时去网上查的各种资料。只是发现学东西还是要写点东西,不然前边写着后边忘了,花的时间都浪费了,写写增加记忆吧。如果是有人刚开始学看到这个相信会有帮助的。
2、开搞
前几天写了篇小文章搞了下EF生成数据库时获取连接字符串的方式,发布时不小心勾选了发布到首页,秒秒钟就被管理员给撤销了( ⊙ o ⊙ ),确实太低端了,博客园锅锅撤销也是可以理解的,废话不多说,今天继续搞一搞获取完连接字符串后EF怎么生成数据库呢,有哪些方式呢?
第一种:先瞅瞅数据库管理器里面有数据库了没,没得话给程序搞一个,具体代码如下
Database.SetInitializer<GGDbContext>(new DropCreateDatabaseIfModelChanges<GGDbContext>());
第二种:先瞄瞄数据库管理器里面有数据库了没,没得话照样建一个,有的话再瞄瞄程序里面的Model是否有变化,比如有个属性叫Name原本你设定的是string类型,现在你手欠改成int了,又或者你新加了一个Age属性,都算模型改变了,不管三七二十一把原来的数据库干掉,再新建一个,具体代码如下:
Database.SetInitializer<GGDbContext>(new DropCreateDatabaseIfModelChanges<GGDbContext>());
第三种:不管三七二十一只要数据库管理器里有数据库就给干掉然后再建个,有钱任性!代码如下:
Database.SetInitializer<GGDbContext>(new DropCreateDatabaseAlways<GGDbContext>());
代码挺像的对吧,其实上面那三个不同的类都实现了一个IDatabaseInitializer接口,看名字就知道是数据初始化接口,约定了建立数据库的方式,咱么可以自己实现这个接口自己指定建库方式,但我基本上不会这么做,因为上面三种基(zi)本(ji)够(tai)用(cai)了,更多的是继承上面三个类自己再做一些定制化的修改。
看到这里性子急的会说了,你巴拉巴拉说这么多,代码也贴了不说写在哪写建毛的库啊,别急,这就来,具体放哪这要看你自己了,一般是放在程序入口,就拿ASP.NET MVC为例吧,放在Global.asax文件里面Application_Start方法里面,也就是程序启动时检查一下,如下:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); Database.SetInitializer<GGDbContext>(new CreateDatabaseIfNotExists<GGDbContext>()); }
好了,代码撸完了,启动程序开始调试吧,OK~程序跑起来了,一切没问题,打开数据库管理器看看建的数据库啥样,貌似然并卵。。。。。数据库里空空如也,毛也没有,为啥呢,因为以上代码只是设置了数据库生成方式,真正建库动作发生在咱们定义的数据上下文类(GGDbContext)初始化时,因为这个类初始化时会同时触发数据库初始化方法,这个时候EF就会吭哧吭哧替咱们建库啦,所以仅仅设置这个不行的,可以在上面代码后再加一行:
new GGDbContext().Database.Initialize(true);
手动初始化数据库,这次再启动程序就能自动建库啦~当然没必要非要在这里建库,也可以在数据操作时通过构造GGDbContext类实例方式让EF为咱们建库。
3、问题及解决方案
当模式设置成DropCreateDatabaseIfModelChanges时,当模型改变时运行程序会出现这个错误:此操作要求连接到 \'master\' 数据库。无法创建与 \'master\' 数据库之间的连接,这是因为已打开原始数据库连接,并且已从连接字符串中删除凭据。请提供未打开的连接。非常纠结,我花了半天的时间在网上找各种原因,大多数人都说在连接字符串里加Integrated Security=true即可,并且大多说是亲测,我不知道他们用的什么版本的EF,不过我用的4.0加了之后虽然不会提示这个错误但是会有其他错误出现,因为以上的设置是通过Windows身份验证连接数据库时用的,而我的连接字符串是通过用户uid和pwd连接的(解决方案里面给的例子也是这种方式),所以我目前不确定他们是错误的还是EF版本不同导致的,最终我也没找到解决办法,不过如果你也遇到了,我可以告诉你,别找答案了,这TM就是一个bug!!!EF6.0里面已经修复了这个鬼东西,不会再提示上面的问题了。
以上是关于EF Codefirst生成数据库的三种方式的主要内容,如果未能解决你的问题,请参考以下文章
第十三节: EF的三种模式 之 来自数据库的CodeFirst模式