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

