ASP.NET Core MVC+EF Core从PostgreSQL转MySQL迁移语法错误求助
ASP.NET Core MVC + EF Core 从PostgreSQL切换到MySQL迁移报错解决
我开发的ASP.NET Core MVC + EF Core应用原本使用PostgreSQL,现需切换至MySQL,执行数据库迁移时出现SQL语法错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'uuid NOT NULL,
Usernametext NOT NULL,
已修改实体配置类、模型类、appsettings及DI数据库连接配置,相关代码如下:
实体类代码
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace DbOptions.Models { [Table("Users")] public class user_entity { [Key] [Column("Id")] public Guid Id { get; set; } [Required] [Column("Username")] [StringLength(255)] public string Username { get; set; } [Required] [Column("Email")] [StringLength(255)] [EmailAddress] public string Email { get; set; } [Required] [Column("phoneNumber")] [StringLength(50)] public string phoneNumber { get; set; } [Required] [Column("passwordHash")] [StringLength(255)] public string passwordHash { get; set; } public virtual List<order_entity> orders { get; set; } = new List<order_entity>(); } }
实体配置类代码
using DbOptions.Models; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace DbOptions.Configuration { public class user_config : IEntityTypeConfiguration<user_entity> { public void Configure(EntityTypeBuilder<user_entity> builder) { builder.ToTable("Users"); builder.HasKey(x => x.Id); builder.Property(x => x.Id) .HasColumnType("VARCHAR(36)") // 修改为VARCHAR(36) .IsRequired(); builder.Property(x => x.Username) .IsRequired() .HasMaxLength(255) .HasColumnType("VARCHAR(255)"); builder.Property(x => x.Email) .IsRequired() .HasMaxLength(255) .HasColumnType("VARCHAR(255)"); builder.Property(x => x.phoneNumber) .IsRequired() .HasMaxLength(50) .HasColumnType("VARCHAR(50)"); builder.Property(x => x.passwordHash) .IsRequired() .HasMaxLength(255) .HasColumnType("VARCHAR(255)"); builder.HasMany(x => x.orders) .WithOne(a => a.User) .HasForeignKey(a => a.UserId) .OnDelete(DeleteBehavior.Cascade); builder.HasIndex(x => x.Email).IsUnique(); builder.HasIndex(x => x.Username).IsUnique(); } } }
解决步骤:
安装正确的MySQL EF Core驱动
确保项目中安装Pomelo.EntityFrameworkCore.MySql(目前主流的MySQL EF Core provider),可通过NuGet包管理器或命令安装:Install-Package Pomelo.EntityFrameworkCore.MySql修正Guid类型映射
虽然配置了VARCHAR(36),但EF Core可能仍在生成PostgreSQL的uuid类型SQL,可通过两种方式修复:- 全局配置(在DbContext的
OnModelCreating中):protected override void OnModelCreating(ModelBuilder modelBuilder) { // 全局将Guid映射为MySQL的VARCHAR(36) modelBuilder.Properties<Guid>().Configure(p => p.HasColumnType("VARCHAR(36)")); // 应用实体配置类 modelBuilder.ApplyConfigurationsFromAssembly(typeof(user_config).Assembly); } - 单独配置Id属性:
在实体配置类的Id属性配置中添加HasConversion<string>(),强制将Guid转为字符串存储:builder.Property(x => x.Id) .HasColumnType("VARCHAR(36)") .IsRequired() .HasConversion<string>();
- 全局配置(在DbContext的
清理并重新生成迁移
旧迁移文件残留PostgreSQL语法,必须清理后重新生成:- 删除项目中
Migrations文件夹下的所有迁移文件(可保留DbContextModelSnapshot.cs,也可一并删除) - 在Package Manager Console执行:
Add-Migration InitialCreate_MySQL - 执行迁移:
Update-Database
- 删除项目中
检查连接字符串与DbContext配置
确认appsettings.json中的连接字符串为MySQL格式:"ConnectionStrings": { "DefaultConnection": "server=localhost;database=你的数据库名;user=root;password=你的密码;charset=utf8mb4" }并在Program.cs(或Startup.cs)中正确配置DbContext:
builder.Services.AddDbContext<你的DbContext类>(options => options.UseMySql(builder.Configuration.GetConnectionString("DefaultConnection"), ServerVersion.AutoDetect(builder.Configuration.GetConnectionString("DefaultConnection"))));
内容的提问来源于stack exchange,提问作者Женя Печёнкин
相关产品推荐
相关产品推荐

