EF 6 Code-First系列文章目录:数据库
当你第一次运行Code-First应用程序的时候,EF就会为咱们建立数据库,可是,后面呢,第二次第三次..的时候会是什么状况?是否是每次运行程序的时候,都会建立一个新的数据库?生产环境中会是什么状况?当你改变你的领域模型的时候,你怎么修改数据库呢?为了解决这些状况,你须要来使用数据库初始化策略。app
EF 6中,有四种不一样的数据库初始化策略:ide
为了使用上面提到的4个数据库初始化策略,你能够在上下文类中,使用Database类,例以下面代码:学习
你若是想使用自定义的数据库初始化策略,就能够继承上面三个中的其中一个策略,例如:测试
在上面的代码中,SchoolDBInitiallizer就是一个自定义的数据库初始化策略类,它继承自CreateDatabaseIfNotExists。这种作法,将初始化策略代码从上下文类中分离开来了。ui
在配置文件中建立数据库初始化策略spa
你一样能够在配置文件中,设置数据库初始化策略。例如,下面代码在配置文件中设置了默认的初始化策略--CreateDatabaseIfNotExists。.net
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="DatabaseInitializerForType SchoolDataLayer.SchoolDBContext, SchoolDataLayer" value="System.Data.Entity.DropCreateDatabaseAlways`1[[SchoolDataLayer.SchoolDBContext, SchoolDataLayer]], EntityFramework" />
</appSettings>
</configuration>
你能够按照下面设置自定义的初始化策略:翻译
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="DatabaseInitializerForType SchoolDataLayer.SchoolDBContext, SchoolDataLayer" value="SchoolDataLayer.SchoolDBInitializer, SchoolDataLayer" />
</appSettings>
</configuration>
关闭数据库初始化策略
你能够为应用程序关闭数据库初始化策略。假设你不想丢失生产环境的数据,你能够按照下面的设置,关闭数据库初始化策略:
一样你能够经过,配置文件来关闭数据库初始化策略:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="DatabaseInitializerForType SchoolDataLayer.SchoolDBContext, SchoolDataLayer" value="Disabled" />
</appSettings>
</configuration>
好了,理论介绍完了,咱们何不动手实践一下呢?
这里我建立一个名称为EFDbInitializer控制台应用程序,安装好EF 6,来验证今天所学:
为了简单起见,我只建立一个Student类,和一个上下文类:
public class Student { /// <summary>
/// 学生ID /// </summary>
public int StudentID { get; set; } /// <summary>
/// 学生姓名 /// </summary>
public string StudentName { get; set; } /// <summary>
/// 学生年龄 /// </summary>
public int Age { get; set; } /// <summary>
/// 邮箱 /// </summary>
public string Email { get; set; } /// <summary>
/// 性别 /// </summary>
public Gender Gender { get; set; } } public enum Gender { /// <summary>
/// 男士 /// </summary>
Man=0, /// <summary>
/// 女士 /// </summary>
Woman=1 }
public class EFDbContext:DbContext { public EFDbContext() : base("name=Constr") { } public DbSet<Student> StuentTable { get; set; } }
数据库配置信息:
<!--数据库链接字符串-->
<connectionStrings>
<add name="Constr" connectionString="server=.;database=EFInitiallizerDB;uid=sa;pwd=Password_1" providerName="System.Data.SqlClient"/>
</connectionStrings>
测试代码:
class Program { static void Main(string[] args) { using (var db = new EFDbContext()) { Student stuModel = new Student() { StudentName="曹雪芹", Age=18, Gender=Gender.Man, Email="caoxueqin@163.com" }; db.Entry(stuModel).State = EntityState.Added; db.SaveChanges(); } Console.WriteLine("success"); Console.ReadKey(); } }
运行程序:
说明建立数据库成功了,里面咱们插入了一条记录。咱们看看:
从图中能够看到,EF默认生成的表名称就是实体名称+一个后缀s.默认映射实体中全部的属性。【注意:只映射有get;set;的属性哦】
如今,咱们用这个数据库,来验证一下今天所学:
修改上下文类:加一句代码,以下标识:
而后运行程序:
看到又成功了,注意,数据库中以前有一条数据,如今咱们应用了这个DropCreateDatabaseAlways策略,那么数据库中仍是会只有一条数据的,不信咱们看:
在来验证一下,CreateDatabaseIfNotExists策略,修改一下上下文类中的代码:
运行程序:
成功了,这个时候,请注意:数据库中应该是有两条数据的,由于数据库已经存在了,应用这个策略以后,EF不会再删除数据库,从新建立。咱们看看:
再验证一下DropCreateDatabaseIfModelChanges策略,
咱们修改一下Student实体,新增一个Password字段。
而后修改一下上下文类:
运行程序:
看到了么,又成功了,这个时候,数据库应该只有一条语句,由于咱们模型改变了,Students表应该还多了一个Password列。咱们看看:
好了,如今咱们来验证一下,自定义的数据库初始化策略。
建立一个自定义的数据库初始化策略类,继承自:DropCreateDatabaseIfModelChanges
/// <summary>
/// 自定义数据库初始化策略类 /// </summary>
public class CustomeDBInit: DropCreateDatabaseIfModelChanges<EFDbContext> { protected override void Seed(EFDbContext context) { Student stuModel = new Student() { StudentName="貂蝉", Age=20, Gender=Gender.Woman, Password="*******", Email="diaochan@163.com" }; context.Entry(stuModel).State = EntityState.Added; context.SaveChanges(); } }
而后修改Student实体,新增一个QQ属性。
在修改一下测试代码:
修改一下上下文类的代码:
运行程序:
成功了,咱们看看数据库,这个时候数据库有数据么,大家猜猜???有数据的话,有几条数据呢???答案是一条数据,就是我在自定义数据库初始化策略中添加的一条。
如今,咱们来验证一下,咱们如何在配置文件中,配置咱们的数据库初始化策略:
个人项目的命名空间是:EFDbInitializer,配置的要点就是DatabaseInitializerForType 命名空间.上下文类,命名空间,value值就是:命名空间.自定义的数据库初始化策略类,命名空间。
而后修改一下上下文类:
运行程序:
看看数据库:
不相信配置文件配置的这个策略被执行了的话,咱们删除数据库,而后修改实体看看:
1.删除数据库
2.修改一下实体:注释QQ属性
3.修改上下文类:
配置文件仍是这样:
运行程序:
看看数据库发生了什么:能够看到QQ列不见了,仍是有一条数据,咱们在自定义类中添加的,说明配置文件成功了配置数据库初始化策略。
好了,最后看看,怎么关闭数据库初始化策略吧:
1.取消注释QQ属性:
2.修改自定义的初始化策略类:
3.运行程序:
看,报错了哦,这是由于咱们使用CreateDatabaseIfNotExists策略的时候,若是实体模型发生改变的话,就会抛异常,这个异常能够经过,数据库迁移技术解决,还能够经过关闭数据库初始化策略解决,这里我采用第二种解决方法。
关闭数据库策略。
修改上下文类:
运行程序:
咦,怎么仍是报错呢??原来配置文件中,还没注释掉呢,咱们注释一下:
再运行,咦,又报错了,这是错误不同哦,QQ列名无效,哦,明白了, 关闭策略以后,咱们就不会再建立数据库了,【这个时候,咱们自定义的策略类是CreateDatabaseIfNotExists,数据库已经存在就不会删除建立】,然而QQ这一个属性还在Student实体中,EF就会要映射到数据库,这就冲突了,咱们注释QQ属性。
注释QQ属性,在运行:
看,成功了吧,是否是很爽?咱们看看数据库:
好了,上面就是咱们今天学习的所有内容,数据库初始化策略,有不明白的,能够留言,我会一一回复,谢谢支持。