.Net Core 6.0+EF操作MySQL LongBlob大数据时读取长度为0求助
解决EF Core操作MySQL大LongBlob读取长度为0的问题
问题描述
使用.NET Core 6结合Entity Framework Core操作MySQL,实体类Blob的Data字段标记为LongBlob类型,依赖包为Microsoft.EntityFrameworkCore 6.0.10、MySql.Data 8.0.31、MySql.EntityFrameworkCore 6.0.7。程序插入小尺寸Blob(如50字节)时能正常读取数据长度,但插入大尺寸Blob(如50000字节)后,读取到的Data数组长度为0。
复现代码
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Db; using Microsoft.EntityFrameworkCore; using MySql.Data.MySqlClient; using MySql.EntityFrameworkCore.Extensions; namespace ConsoleApp1 { class Blob { [Key] public int Id { get; set; } public string Name { get; set; } [Column(TypeName = "LongBlob")] public byte[] Data { get; set; } } class AppContext : DbContext { public DbSet<Blob> Blobs { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseMySQL("server=localhost;database=testblob;user=xyz;password=xyz"); } } internal class Program { static void Main(string[] args) { insert(); read(); } private static void insert() { using (AppContext ctx = new AppContext()) { ctx.Database.EnsureCreated(); int blobsize = 50000; byte[] bytes = new byte[blobsize]; for (int i = 0; i < bytes.Length; i++) { bytes[i] = Convert.ToByte(i % 256); } Blob one = new Blob {Data = bytes, Name = "Hello"}; ctx.Blobs.Add(one); ctx.SaveChanges(); } } private static void read() { using (AppContext ctx = new AppContext()) { foreach (Blob blob in ctx.Blobs) { Console.WriteLine($"{blob.Id}={blob.Data.Length}"); } } } } }
解决方案
1. 开启Blob强制加载配置
修改AppContext的OnConfiguring方法,添加EnableLoadingLazyBlob()配置,强制EF Core加载完整的Blob数据,避免延迟加载导致的空数组:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseMySQL("server=localhost;database=testblob;user=xyz;password=xyz") .EnableLoadingLazyBlob(); }
2. 查询时强制立即加载
在查询Blob数据时使用AsNoTracking(),绕过EF的跟踪机制,强制立即加载所有字段数据:
private static void read() { using (AppContext ctx = new AppContext()) { foreach (Blob blob in ctx.Blobs.AsNoTracking()) { Console.WriteLine($"{blob.Id}={blob.Data.Length}"); } } }
3. 调整MySQL数据包大小限制
在连接字符串中添加max allowed packet参数,增大允许传输的数据包大小(示例设置为10MB):
optionsBuilder.UseMySQL("server=localhost;database=testblob;user=xyz;password=xyz;max allowed packet=10485760");
问题原因
- MySql.EntityFrameworkCore默认对大尺寸Blob采用延迟加载策略,若遍历实体时未触发加载逻辑,会返回空数组;
- MySQL默认的
max_allowed_packet限制了单次传输的数据大小,超过阈值会导致数据未完整写入或读取。
内容的提问来源于stack exchange,提问作者Volkhard Vogeler
相关产品推荐
相关产品推荐

