EntityFrameworkCore 运行时数据迁移

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

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下自动
### 使用 C# 和 Entity Framework Core 进行数据迁移 #### 安装必要的 NuGet 包 为了使 EF Core 正常工作并支持 SQL Server,需安装如下 NuGet 包[^5]: - `Microsoft.EntityFrameworkCore.SqlServer`:用于连接和操作 SQL Server 数据库。 - `Microsoft.EntityFrameworkCore.Tools`:提供了设计工具来帮助创建和应用迁移。 这些包可以在 Visual Studio 的 NuGet 包管理器中找到,也可以通过 .NET CLI 命令行工具进行安装。 #### 创建新的控制台应用程序作为启动项目 当准备执行迁移,建议新建一个控制台应用程序并将它设置为解决方案中的启动项目。这有助于简化命令行交互过程[^4]。 #### 添加模型类与上下文配置 定义实体类表示要存储的数据结构,并建立继承自 `DbContext` 的数据库上下文类以描述如何访问这些实体所对应的表。例如: ```csharp public class Product { public int Id { get; set; } public string Name { get; set; } } public class MyDbContext : DbContext { public DbSet<Product> Products { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseSqlServer("YourConnectionStringHere"); } ``` #### 执行初始迁移 一旦有了完整的上下文定义之后就可以开始第一次迁移了。打开 Package Manager Console 或者使用 dotnet cli 工具输入以下命令之一来生成第一个迁移脚本[^3]: **Package Manager Console** ```powershell Add-Migration InitialCreate ``` **dotnet CLI** ```bash dotnet ef migrations add InitialCreate ``` 此命令会在项目的 Migrations 文件夹下创建一个新的 C# 类文件,其中包含了 `Up()` 方法用来增加新字段或修改现有模式;而 `Down()` 则负责撤销更改以便回滚到前一状态。 #### 应用迁移至目标数据库 最后一步就是把刚刚制作好的迁移实际应用于真实的数据库实例上。同样地,在 PMConsole 中运行: **Package Manager Console** ```powershell Update-Database -Verbose ``` 或者借助 dotnet CLI 来完成相同的操作: **dotnet CLI** ```bash dotnet ef database update --verbose ``` 上述 `-Verbose` 参数可以显示详细的日志信息方便调试问题所在之处。 #### 修改后的例子展示 假设现在想要给产品表新增加一个描述列,则只需编辑相应的上下文类并在 Models 下面加入属性即可。接着重复上面提到过的添加迁移(`Add-Migration`) 和更新 (`Update-Database`) 流程就能轻松实现变更. ```csharp // 更新后的 Model public class Product { ... public string Description {get;set;} } ``` ```csharp // 自动生成的 Migration Code Snippet protected override void Up(MigrationBuilder migrationBuilder){ migrationBuilder.AddColumn<string>( name:"Description", table:"Products", maxLength:500, nullable:true); } ... ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值