EntityFrameworkCore(以后简称EFCore)是.net core的一个orm框架,以前在.net framework中使用时候利用code first可以在程序运行的时候自动迁移数据库,更新数据库表结构,但在.net core中好像没有这个功能,反正看了例子查资料都没找到,于是决定自己实现这个机制
实际上EFCore数据库迁移是利用一个迁移历史版本库存下当前模型版本的快照,需要迁移的时候只要根据当前模型新生成一个快照进行比对,发现不同就生成迁移代码,迁移后再将新的版本存起来
在EFCore设计时的类库中有一个IMigrationsSqlGenerator接口用于创建迁移的Sql脚本,IMigrationsModelDiffer接口用于模型的迁移比对,由于是设计时执行的所以要用DesignTimeServicesBuilder来获取相应接口的实例
每次迁移生成的快照实际上是动态生成的类,所以要用动态编辑机制CSharpCompilation和CSharpCompilationOptions
直接把关键代码贴上来了
private async Task RunUpdateAsync()
{
// 创建一个DbContext,具体方法怎样都行
var _dbContext = await CreateDbContext();
IModel lastModel = null;
try
{
// 这里用一个表来存迁移记录,迁移时将上一个版本取出来
var lastMigration = _dbContext.Migrations
.OrderByDescending(e => e.MigrationTime)
.OrderByDescending(e => e.Id) // mysql下自动