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
相关产品推荐
相关产品推荐

