EF Codefirst学习系列一:生成数据库数据库连接字符串
1、写在前两
最近发现,学习这件事,最好还是边学边写更好,俗话真没骗我们,好记性不如烂笔头,所以决定开始写博客,希望自己能坚持吧
2、开搞
EF在codefirst模式下能自动生成数据库,那它是如何生成的呢,默认情况下如何生成的呢?先来看看用来生成数据库的DbContext类吧
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 protected DbContext(); 2 protected DbContext(DbCompiledModel model); 3 public DbContext(string nameOrConnectionString); 4 public DbContext(DbConnection existingConnection, bool contextOwnsConnection); 5 public DbContext(ObjectContext objectContext, bool dbContextOwnsObjectContext); 6 public DbContext(string nameOrConnectionString, DbCompiledModel model); 7 public DbContext(DbConnection existingConnection, DbCompiledModel model, bool contextOwnsConnection);
可以看到各个构造函数,变量名也挺清楚,一般咱们用第三个构造函数,给其传递连接字符串名,假设为ABC,EF会自动到配置文件里面Connections标签下找name叫ABC的标签,再找到里面所设置的connectionString。根据这个连接字符串连接到数据库管理器生成数据库,如果连接字符串没问题那么数据库就这么Duang~的一下生成了,至于表也会根据model自动生成的,都无需咱们操心。
当然上面是基于你配置了连接字符串且没问题的情况下,那么问题来了,不是挖掘机哪家强,也不是哪家炒菜香,而是如果你没有配置字符串或者你配置了字符串但是你传递的名字不对时EF是怎么处理的呢?
废话不多说,直接调试,在Global.asax中的Application_Start方法中添加如下代码,进行初始化,不然即使添加了DbContext类不通知程序,EF也不知道咱们要建数据库的,代码如下:
new EFDbContext().Database.Initialize(true);
这次我虽然在配置文件里面配置了字符串,但是我故意传递了一个错误的字符串(任性的人生无需解释),下图是提取出来的EF的用于生产数据库的连接字符串,可以看到是用本地默认实例,采用Windows身份验证方式连接的,如果你本地有这个实例且有建库权限,那就根据你传递的字符串作为数据库名建库了。。。。。
当然,如果你写的字符串没问题,那就一切OK,EF完全按着你的意思走,读你的连接字符串,以你设置的方式进行数据库验证,以你的设置建库,一切水到渠成~
然而EF为什么会这么做呢,菜逼的我也模仿大神们想看下源码,然而终究是菜逼,没找到上具体的建库代码,但是看了咱们使用的DbContext构造方法后我确定我上面的猜测是正确的:
public DbContext(string nameOrConnectionString);
nameOrConnection:名称或者连接字符串,名称自然是数据库名了,即内部判断非连接字符串后会将参数作为数据库名来处理。
3、总结
EF还是比较强大的吧,好吃不好吃都接受,但是你给它个砖头那它真没本事吃下去,虽然默认能创建,不过为了避免出错建议还是自己配置连接字符串,因为毕竟自己写的才是最有把握控制的不是么。