首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

生产环境更新数据库

一、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生成的文件全部删除掉。然后就是编译生成,然后程序就可以交给测试或实施工程师了。

“无忌,刚才讲的招式,你还记得多少?”上面只是用一个简单的例子来进行讲解,实际项目中,各位灵活变通。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180612G16SB000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券