仅通过C# Web API代码调整MySQL列顺序?EF Core 6迁移失效问题
EF Core 6 修改MySQL列顺序问题
尝试仅通过EF Core 6项目代码修改MySQL数据库的列顺序,调研得知可使用[Column(Order=n)]特性,但该特性仅在首次迁移时生效,后续修改模型中的列顺序后,数据库迁移不会同步更新列顺序。
初始模型及数据库结构
模型代码:
public class Student { [Column(Order=0)] public int Id {get; set;} [Column(Order = 1)] public string Name {get; set;} [Column(Order = 2)] public DateTime Created_at {get; set;} }
数据库表结构:
+----+------+------------+ | Id | Name | Created_at | +----+------+------------+
修改后的模型及实际结果
添加新属性Age并设置Column(Order=2),同时将Created_at的Order改为3,执行迁移后,数据库中Age列仍显示在末尾,不符合预期。
最新模型代码:
public class Student { [Column(Order=0)] public int Id {get; set;} [Column(Order = 1)] public string Name {get; set;} [Column(Order = 2)] public int Age {get; set;} [Column(Order = 3)] public DateTime Created_at {get; set;} }
实际数据库表结构:
+----+------+------------+-----+ | Id | Name | Created_at | Age | +----+------+------------+-----+
预期列顺序
+----+------+-----+------------+ | Id | Name | Age | Created_at | +----+------+-----+------------+
环境信息
- 数据库提供程序:Pomelo.EntityFrameworkCore.MySql
- 目标框架:.NET 6.0
- IDE:Visual Studio 2019 16.3
解决方法
EF Core默认不会检测Column(Order)的变更,因此需要手动编写迁移代码来调整列顺序:
- 生成空迁移:
Add-Migration AdjustStudentColumnOrder
- 打开生成的迁移文件,在
Up方法中添加MySQL原生SQL语句指定列的位置:
protected override void Up(MigrationBuilder migrationBuilder) { // 添加Age列(新增列场景) migrationBuilder.AddColumn<int>( name: "Age", table: "Student", type: "int", nullable: false, defaultValue: 0); // 调整Age列到Name之后 migrationBuilder.Sql(@"ALTER TABLE `Student` MODIFY COLUMN `Age` INT NOT NULL AFTER `Name`;"); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropColumn( name: "Age", table: "Student"); }
- 执行迁移:
Update-Database
注意:MySQL中调整列顺序需使用
ALTER TABLE ... MODIFY COLUMN ... AFTER ...语法,若要将列放在开头,可替换为FIRST关键字。生产环境操作前请做好数据备份。
内容的提问来源于stack exchange,提问作者Rotnak
相关产品推荐
相关产品推荐

