You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,
Username text NOT NULL,
Email character varying(255' at line 2

已修改实体配置类、模型类、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,可通过两种方式修复:

    1. 全局配置(在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);
      }
      
    2. 单独配置Id属性:
      在实体配置类的Id属性配置中添加HasConversion<string>(),强制将Guid转为字符串存储:
      builder.Property(x => x.Id)
          .HasColumnType("VARCHAR(36)")
          .IsRequired()
          .HasConversion<string>();
      
  • 清理并重新生成迁移
    旧迁移文件残留PostgreSQL语法,必须清理后重新生成:

    1. 删除项目中Migrations文件夹下的所有迁移文件(可保留DbContextModelSnapshot.cs,也可一并删除)
    2. 在Package Manager Console执行:
      Add-Migration InitialCreate_MySQL
      
    3. 执行迁移:
      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,提问作者Женя Печёнкин

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:23:10