一、EntityFramwork自带的初始化器实现类(6.0以后的版本)。
(1)CreateDatabaseIfNotExists
说明:如果不存在就新建数据库。
(2)DropCreateDatabaseAlways
说明:总是删除后新建数据库。
(3)DropCreateDatabaseIfModelChanges
说明:如果数据库表结构(代码中实体类)有变更,就删除并新建数据库。
(4)MigrateDatabaseToLatestVersion
说明:根据程序Migrations文件夹中的更新类,更新数据库。参数部分,相比其他的初始化器,多了一个TMigrationsConfiguration类型参数,也就是代码中Migrations文件夹中的Configuration类。该类默认的修饰符是“internal sealed”,如果是不同类库调用,需要修改为public。
(5)NullDatabaseInitializer
说明:使用此初始值设定项将禁用给定上下文类型的数据库初始化,等同与传递null。
关于初始化器在代码中如何使用,参考《
入门湿货(一)简单示例
》此处不再啰嗦。
二、生产环境下自动更新数据库。
实际开发过程中,一定会遇到以下这种情况:第一版程序发布部署之后(恶魔之门开启时……),用户进行需求变更导致原来的数据库表结构需要变更(增加字段、更改类型……)的情况。
这种情况在开发过程中,一般开发都没问题(你非要说实在有问题,那请参考之前的《入门湿货(三)数据库迁移》)。但是开发完了,该如何发布部署呢?完全靠测试和实施工程师么?人家会发飙的,跑你家大小便怎么办?所以还是需要想办法。
根据上面第一部分的介绍,我们可以看到EntityFramwork自带的初始化器中那个最特殊的要两个参数的初始化器实现类“MigrateDatabaseToLatestVersion”。我们就是通过这个类来实现在生产环境下的数据库自动更新。
1、在程序启动的时候,指定该初始化器类。
Database.SetInitializer(new MigrateDatabaseToLatestVersion());
var TContext=new TContext();
以上黄色背景部分,是由于EntityFramwork的懒加载,必须要有这行,否则数据库不会更新。
2、准备Migrations文件夹中的迁移记录类。
比如我第一版程序中有一个实体类User:
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public string PassWord { get; set; }
}
在第二版程序中,该实体字段进行变更:
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public string PassWord { get; set; }
public bool IsDelete { get; set; }
}
代码修改后,在程序包管理器控制台,输入“add-migration update”,在项目的Migrations文件夹下就多了以下这个类:
public partial class update : DbMigration
{
public override void Up()
{
AddColumn("dbo.Users", "IsDelete", c => c.Boolean(nullable: false));
}
public override void Down()
{
DropColumn("dbo.Users", "IsDelete");
}
}
接下来,假设你的程序修改调试都没有问题,在发布更新包时,需要注意的是,Migrations文件夹里面,除了Configuration.cs以及上一步生成的update类(注意:文件名不是update.cs,一般会有日期前缀)之外,其他的EntityFramwork生成的文件全部删除掉。然后就是编译生成,然后程序就可以交给测试或实施工程师了。
“无忌,刚才讲的招式,你还记得多少?”上面只是用一个简单的例子来进行讲解,实际项目中,各位灵活变通。
领取专属 10元无门槛券
私享最新 技术干货