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

.NET 6升级后图片无法存入MySQL数据库的问题求助

.NET 6升级后MySQL MediumBlob存储大文件失败问题

近期将ASP.NET 5 Web API升级至.NET 6并同步更新所有NuGet包,其他功能正常,但新图片存入MySQL数据库时出现异常:小于40KB的图片可正常保存,超过该大小的图片保存失败,且无报错信息与异常日志。数据库中的mediumblob字段不为空,但为空Blob,说明有写入操作但未正确存储数据。

推测是byte[]传递给Entity Framework后的转换过程出现问题,可能与序列化相关,当前使用Newtonsoft而非.NET 6新增的System.Text.Json。

已尝试的方案

  • 替换Newtonsoft为System.Text.Json,引发大量其他问题;
  • 改用Pomelo.EntityFrameworkCore.MySql替代MySQL.EntityFrameworkCore,与现有DbContext冲突;
  • 在调用_dbContext.SaveChangesAsync()前打断点,确认byte[]数据正常,但执行后数据库中Blob为空,其他数据可正常保存;
  • 回退至.NET 5及旧版本包后,图片存储完全正常,仅修改项目文件中的.NET版本为6.0就会触发问题。

相关代码

Startup.cs

services
    .AddControllers()
    .AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                options.SerializerSettings.Formatting = Formatting.None;
                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                options.SerializerSettings.MaxDepth = 64;
            });

CampaignService.cs

campaignToUpdate.CampaignName = campaign.CampaignName;
campaignToUpdate.CampaignDescription = campaign.CampaignDescription;
campaignToUpdate.StartDate = campaign.StartDate;
campaignToUpdate.EndDate = campaign.EndDate;
campaignToUpdate.PrizeDescription = campaign.PrizeDescription;

campaignToUpdate.PrizeImage = campaign.PrizeImage;

campaignToUpdate.IsIndividualCampaign = campaign.IsIndividualCampaign;
campaignToUpdate.IsTeamCampaign = campaign.IsTeamCampaign;

await _dbContext.SaveChangesAsync();

DbContext配置片段

entity.Property(e => e.PrizeImage).HasColumnType("mediumblob");

补充测试信息

  • 在新项目中更新以下NuGet包后会出现相同问题:Microsoft.EntityFrameworkCore V6.0.15、MySql.EntityFrameworkCore V6.0.10;
  • 本地升级MySQL至8.0.27后问题仍存在;

补充测试代码

UpdateCampaignImageRequest

public class UpdateCampaignImageRequest
{
    public int CampaignId { get; set; }
    public byte[] Image { get; set; }
}

TestController.cs

[HttpPost]
public async Task<IActionResult> UpdateAsync([FromBody] UpdateCampaignImageRequest request)
{
    await _dbContext.Database.BeginTransactionAsync();
    var campaign = await _dbContext.Campaigns.SingleOrDefaultAsync(x => x.CampaignId == request.CampaignId);

    if (campaign == null)
    {
        return NotFound();
    }

    campaign.PrizeImage = request.Image;

    await _dbContext.SaveChangesAsync();
    await _dbContext.Database.CommitTransactionAsync();

    return Ok();
}

Campaign实体类

public class Campaign
{
    public int CampaignId { get; set; }
    public int? CompanyId { get; set; }
    public int? ChallengeId { get; set; }
    public string CampaignName { get; set; }
    public string CampaignDescription { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public string PrizeDescription { get; set; }
    public byte[] PrizeImage { get; set; }
    public string PrizeImageName { get; set; }
    public string UniqueCampaignCode { get; set; }
    public bool IsIndividualCampaign { get; set; }
    public bool IsTeamCampaign { get; set; }

    [NotMapped]
    public int? TotalParticipants { get; set; }

    [NotMapped]
    public string CurrentLeader { get; set; }

    [NotMapped]
    public bool HasInviteEmailSent { get; set; }
}

Context完整代码

public partial class Context : DbContext
{
    public Context()
    {
    }

    public Context(DbContextOptions<Context> options)
        : base(options)
    {
    }
    public virtual DbSet<Campaign> Campaigns { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Campaign>(entity =>
        {
            entity.HasIndex(e => e.CompanyId, "Campaigns_ibfk_1");

            entity.HasIndex(e => e.ChallengeId, "Campaigns_ibfk_2_idx");

            entity.HasIndex(e => new { e.StartDate, e.EndDate }, "StartDate");

            entity.HasIndex(e => e.UniqueCampaignCode, "UniqueCampaignCode")
                .IsUnique();

            entity.Property(e => e.CampaignId).HasColumnType("int(11)");

            entity.Property(e => e.CampaignDescription).HasMaxLength(128);

            entity.Property(e => e.CampaignName).HasMaxLength(30);

            entity.Property(e => e.ChallengeId).HasColumnType("int(11)");

            entity.Property(e => e.CompanyId).HasColumnType("int(11)");

            entity.Property(e => e.PrizeDescription).HasMaxLength(500);

            entity.Property(e => e.PrizeImage).HasColumnType("mediumblob");

            entity.Property(e => e.PrizeImageName).HasMaxLength(64);

            entity.Property(e => e.UniqueCampaignCode)
                .HasMaxLength(6)
                .IsFixedLength(true);
        });
        OnModelCreatingPartial(modelBuilder);
    }
    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

当前使用依赖版本

  • .NET 6.0
  • Microsoft.EntityFrameworkCore V6.0.15
  • MySql.EntityFrameworkCore V6.0.10
  • Microsoft.Extensions.DependencyInjection V6.0.1

疑问

.NET 6中是否有相关变更导致此问题?官方文档未提及相关破坏性变更,因.NET 5已停止支持必须升级。

内容的提问来源于stack exchange,提问作者James Joubert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:22:13