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

使用.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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:45:22