EntityFrameworkCore 运行时数据迁移

本文介绍了如何在.NET Core中使用EntityFrameworkCore (EFCore) 自动进行运行时数据迁移。传统上,EFCore在.NET Framework中可以自动迁移数据库,但.NET Core中似乎缺失此功能。作者通过创建模型版本快照并进行比对,实现了运行时迁移。关键涉及IMigrationsSqlGenerator接口用于生成SQL脚本,IMigrationsModelDiffer接口进行模型比对,以及动态编译机制CSharpCompilation和CSharpCompilationOptions。文章提供关键代码示例,确保迁移类型的程序集和元数据引用正确,并引用了设计时类库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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下自动
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值