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里面已经修复了这个鬼东西,不会再提示上面的问题了。

时间: 2024-10-17 13:00:54

EF Codefirst生成数据库的三种方式的相关文章

使用DataSet Datatable 更新数据库的三种方式

1:自动生成命令的条件 CommandBuilder 方法a)动态指定 SelectCommand 属性b)利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand.InsertCommand 和 UpdateCommand.c)为了返回构造 INSERT.UPDATE 和 DELETE .SQL CommandBuilder 必须执行 SelectCommand.即:必须额外经历一次到数据源的行程,这可能会降低性能.这也是自动生成命令的缺点.d)

PHP生成word的三种方式

摘要: 最近工作遇到关于生成word的问题 现在总结一下生成word的三种方法. btw:好像在博客园发表博客只要是标题带PHP的貌似点击量都不是很高(哥哥我标题还是带上PHP了),不知道为什么,估计博客园上net技术大牛比较多吧,如果把java,.net,php比作程序员的女友,那么java是Oracle门下的大家闺秀,.net微软旗下的名门望族,PHP则是草根门下的山村野姑,这让我等PHP草民闷骚男情何以堪情何以堪..牢骚发完了,正式写博客吧 正文 PHP生成word原理 利用windows

[PHP]PHP编程操作Mysql数据库的三种方式

当我开始去接触PHP的时候,真切的感受到其所具有的魅力,本着学习的态度和打破固有的语言和模式的想法,开始了PHP之旅,总的来说,走的还是比较顺利,在其中能够看到C,Java,Perl影子,学习曲线不大,但是做好产品仍然有着一条漫漫长路. 多余的话不说了,慢慢感受和领悟,本文主要讲述PHP操作数据库的三种扩展. 如下图是PHP访问数据库的三种扩展方式: 下面举出三种方式访问数据库并查询数据的实例代码: 1.mysql扩展 <?php //1:获取数据库连接 $connection = @ mysq

Code First03---CodeFirst根据配置同步到数据库的三种方式

上一节我们说到使用Fluent API对实体的配置,但是有一个问题了,在业务中我们可以用到的实体很多,那是不是每个都需要这样去配置,这样就造成我们重写的OnModelCreating方法很庞大了.所以我们需要更好的组织Fluent API的配置. 我们知道modelBuilder的Entity<T>泛型方法的返回值是EntityTypeConfiguration<T>泛型类. 所以我们可以定义一个继承自EntityTypeConfiguration<T>泛型类的类来定义

java连接access数据库的三种方式以及远程连接

连接access数据库,网上的内容很多,尝试的过程中也会遇到各种问题,没有特别好的介绍,所以自己想总结一下,日后备用. 这里需要提前说明下,win7系统32bit和64bit默认安装的access都是32bit的,但是如果是64bit的系统连接access数据库时需要安装64bit的office软件,下面会说到. 以64bit操作系统为列 第一种:电脑上配置结合java代码实现 a.打开目录C:\Windows\System32找到odbcad32.exe文件,双击打开 b.点击右侧添加按钮,在

PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)

PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案. PHP的MySQL扩展是设计开发允许php应用与MySQL数据库交互的早期扩展.MySQL扩展提供了一个面向过程的接口,并且是针对MySQL4.1.3或者更早版本设计的.因此这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端进行交互,但并不支持后期MySQL服务端提供的一些特性.由于太古老,又

JDBC操作数据库的三种方式比较

JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL.oracle.DB2等关系型数据库均是通过JDBC来访问的,现在主流的ORM框架Hibernate.Mybatis等均是在JDBC的基础上做的进一步封装.优化.一般小型的项目,可以直接用JDBC来访问数据库,简单方便.我在进过几个项目后,总结了三总JDBC的基本用法,对这几种用法做一个总结. 第一种

调用数据库的三种方式

ThinkPHP 内置了抽象数据库访问层,把不同的数据库操作封装起来.我们只需要使用公共的 Db 类进行操作,无须针对不同的数据库写不同的代码和底层实现.Db 类会自动调用相应的数据库驱动来处理. 一.全局配置定义   在 common/conf/config.php 中 'DB_TYPE'=>'mysql', //数据库类型 'DB_HOST'=>'localhost', //服务器地址 'DB_NAME'=>'thinkphp', //数据库名 'DB_USER'=>'root

连接SQL Server 数据库的三种方式

涉及到配置文件的连接方法: 方式一: 在配置文件中: <configuration> <appSettings> <add key="ConnectionString" value="Data Source=服务器的名称;Initial Catalog=要连接的数据库的名称;User ID=数据库登录名;Password=数据库登录密 码"/> </appSettings> <configuration>