使用.NET 8/EF Core 8/MySQL 8时SaveChangesAsync无法写入BLOB列求助
.NET 8 + EF Core 8 + MySQL 8 BLOB列空值问题
我在使用.NET 8、EF Core 8和MySQL 8开发时遇到如下问题:调用_context.Images.Add(image)可正常执行,但执行await _context.SaveChangesAsync()后,数据库表中仅创建了一行数据,其中BLOB列是空的。手动在数据库中添加BLOB值则可正常显示。
相关代码
Page Model
public class IndexModel : PageModel { private readonly WebAppContext _context; public IndexModel(WebAppContext context) { _context = context; } public async Task<IActionResult> OnPostUploadImage([FromBody] string imageBlob) { try { Image image = new Image { ImageBlob = Convert.FromBase64String(imageBlob) }; _context.Images.Add(image); await _context.SaveChangesAsync(); return new JsonResult(Convert.ToBase64String(image.ImageBlob)); } catch (Exception ex) { Console.WriteLine("Error uploading image: " + ex.Message); return StatusCode(500, "Error uploading image."); } } }
DbContext
public class WebAppContext : DbContext { public DbSet<Image> Images { get; set; } public WebAppContext(DbContextOptions<WebAppContext> options) : base(options) { } }
数据库表结构

解决方法
1. 显式配置实体属性的列类型
EF Core默认可能未正确将byte[]映射为MySQL的BLOB类型,需要在DbContext中添加映射配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Image>() .Property(i => i.ImageBlob) .HasColumnType("longblob"); // 根据图片大小选择blob/mediumblob/longblob }
2. 校验并处理Base64字符串
前端传入的Base64字符串可能带有data:image/png;base64,这类前缀,需要先去除再解析:
public async Task<IActionResult> OnPostUploadImage([FromBody] string imageBlob) { try { // 移除Base64前缀(如果存在) if (!string.IsNullOrEmpty(imageBlob) && imageBlob.StartsWith("data:image/")) { var commaIndex = imageBlob.IndexOf(','); if (commaIndex != -1) { imageBlob = imageBlob.Substring(commaIndex + 1); } } Image image = new Image { ImageBlob = Convert.FromBase64String(imageBlob) }; _context.Images.Add(image); await _context.SaveChangesAsync(); return new JsonResult(Convert.ToBase64String(image.ImageBlob)); } catch (Exception ex) { Console.WriteLine("Error uploading image: " + ex.Message); return StatusCode(500, "Error uploading image."); } }
3. 更新MySQL EF Core驱动
确保使用的Pomelo.EntityFrameworkCore.MySql驱动是最新稳定版,旧版本可能存在BLOB处理的兼容性问题,通过NuGet包管理器更新即可。
4. 强制标记实体状态
如果上下文跟踪出现异常,可手动标记实体为新增状态:
_context.Images.Add(image); _context.Entry(image).State = EntityState.Added; // 强制标记为新增 await _context.SaveChangesAsync();
内容的提问来源于stack exchange,提问作者Mehmet Ali K.
相关产品推荐
相关产品推荐

