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

EF Core 搭配 MySQL 5.6 无法自动生成ID问题求助

解决EF Core + MySQL 5.6下GUID ID自动生成问题

你的问题核心有两点:一是MySQL 5.6没有原生的GUID自动列支持,二是你给模型ID初始化了空GUID,EF Core会把这个当作手动插入的值,不会触发数据库端的自动生成逻辑。

直接给你可行的修改方案:

1. 修改Fluent API配置,让数据库端生成UUID

把模型配置改成这样,给ID列设置数据库默认值为UUID()函数,同时明确标记值由数据库生成:

builder.Entity<Application.Model.FileStreamModel>(b =>
{
    b.ToTable("FilesStream");

    b.HasKey(p => p.Id);

    b.Property(p => p.Id)
      .ValueGeneratedOnAdd()
      .HasDefaultValueSql("UUID()"); // 关键:添加这一行
});

2. 不要给模型ID初始化空GUID

如果你的模型构造函数里把Id设成了Guid.Empty,删掉这个初始化代码。比如原来的模型:

public class FileStreamModel
{
    public Guid Id { get; set; } = Guid.Empty; // 删掉这个赋值
    // 其他属性...
}

改成:

public class FileStreamModel
{
    public Guid Id { get; set; }
    // 其他属性...
}

这样EF Core就会识别到ID需要由数据库生成,不会把空GUID当作插入值,生成的SQL就不会包含Id列的手动赋值,转而由数据库通过UUID()生成。

为什么之前的配置不生效?

  • MySQL 5.6不像MySQL 8.0那样支持DEFAULT UUID()的列定义,必须手动指定默认值函数
  • 当你给Id赋值为Guid.Empty时,EF Core会认为这是你显式提供的插入值,忽略ValueGeneratedOnAdd的配置,直接把空GUID传到SQL里

修改后生成的SQL会变成类似这样,不再包含Id的参数和插入项:

[Parameters=[@p0='2025-01-14T14:13:54.0376360Z' (DbType = DateTime), @p1='xxx' (Nullable = false) (Size = 50), @p2='xxx' (Nullable = false) (Size = 50), @p3='2025-01-14T14:13:54.0376361Z' (DbType = DateTime), @p4='xxx' (Nullable = false) (Size = 500)], CommandType='Text', CommandTimeout='600']
      SET AUTOCOMMIT = 1;
      INSERT INTO `FilesStream` (`InsertedAt`, `Key`, `PartialKey`, `UpdatedAt`, `Url`)
      VALUES (@p0, @p1, @p2, @p3, @p4);

内容的提问来源于stack exchange,提问作者Guilherme Bley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:02:03