我们修改一下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属性,在运行:
看,成功了吧,是不是很爽?我们看看数据库:
好了,上面就是我们今天学习的全部内容,数据库初始化策略,有不明白的,可以留言,我会一一回复,谢谢支持。
|