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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:50:27