一、EF Core 批量添加数据 问题详解 AddRange()

问题整理:

1.对于批量写入数据,每次几万条情况 使用 Add() 方法不合理

2.使用AddRange() 每次批量写入数据也要有个数限制,不然也会异常报错

3.批量写入数据,如果Sqlserver 日志文件或者磁盘空间占满也会抛出异常。

4.批量写入需要控制对象的字符数量,字符数量大的写入慢没太多优化空间,看你的磁盘和硬件情况了。

批量数据写入解决方案:

1.写入每条数据字符量尽可能小

2.分段写入,避免内存不足异常

3.使用第三方库,协助增速写入:Z.EntityFramework.Extensions.EFCore

更多参考:

二、批量数据分段写入富文本字符数量较大, 使用AddRange()

如果不分段写入,内存不足会抛出异常

static void Test3()
{
    // EF Core 批量添加数据 问题详解 AddRange()
    try
    {
        QLSingleContext _context = new QLSingleContext();
        ArtileNews news = _context.ArtileNews.Find(6);
        DateTime start = DateTime.Now;
        List<ArticleInfo> artList = new List<ArticleInfo>();
        for (int i = 0; i < 50000; i++)
        {
            ArticleInfo model = new ArticleInfo();
            model.Title = news.Title;
            // model.Content = news.Content;
            model.Content = "内容稍的测试数据";
            model.ViewCount = 0;
            model.LastEditTime = DateTime.Now;
            model.EmpId = 4;
            artList.Add(model);
        }
        Console.WriteLine($"内存组建完成使用{(DateTime.Now - start).TotalSeconds}秒");
 
 
        //1.批量添加的个数是有上限的,根据自己电脑内存而定
        //2.单条数据字符空间大慢
        //3.数据太多一次添加太慢
        _context.ArticleInfos.AddRange(artList);
        _context.SaveChanges();
        
 
        DateTime end = DateTime.Now;
        Console.WriteLine($"添加成功了{artList.Count}条数据");
        Console.WriteLine($"总共使用{(end - start).TotalSeconds}秒");
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

在这里插入图片描述
分段写入代码处理:

//分段插入----此方法不奏效,但可以解决内存不足的bug
static void MyAddRange(QLSingleContext _context, List<ArticleInfo> artList)
{
    //每次插入2000 条
    int num = 0;
    while (true)
    {
        var temp = artList.Skip(num).Take(10000).ToList();
        if (temp.Count == 0)
            break;
        //使用默认
        _context.ArticleInfos.AddRange(temp);
        _context.SaveChanges();
 
        num += temp.Count;
    }
}

在这里插入图片描述
插入非富文本,字符量小的数据 5万条:
在这里插入图片描述

三、批量查询想增加查询速度,可以取消上下文监听

    //查询禁用跟踪
    //_context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
    // _context.ChangeTracker.AutoDetectChangesEnabled = false;

更多:

EFCore 关联表查询_多表使用整理
Ef Core 使用Entity方式配置外键
SqlServer 大量数据热汇总优化整理
————————————————
版权声明:本文为CSDN博主「天马3798」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011127019/article/details/124898627

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EF Core中,你可以使用以下几种方式来实现批量插入数据: 1. 使用 `AddRange` 方法:这是最简单的一种方法,你可以使用 `AddRange` 方法一次性添加多个实体对象到上下文中,然后通过调用 `SaveChanges` 方法将这些实体对象一起插入到数据库中。示例代码如下: ```csharp List<Entity> entities = new List<Entity> { new Entity { Property1 = value1, Property2 = value2 }, new Entity { Property1 = value3, Property2 = value4 }, // 添加更多实体对象... }; context.AddRange(entities); context.SaveChanges(); ``` 2. 使用原生 SQL:如果你的数据库提供程序支持原生 SQL,你可以将多个插入语句合并为一条 SQL 语句来实现批量插入。示例代码如下: ```csharp string sql = "INSERT INTO TableName (Column1, Column2) VALUES "; List<string> valueStrings = new List<string>(); foreach (var entity in entities) { string values = $"('{entity.Property1}', '{entity.Property2}')"; valueStrings.Add(values); } sql += string.Join(",", valueStrings); context.Database.ExecuteSqlRaw(sql); ``` 请注意,这种方式需要手动构建 SQL 语句,并且要确保输入的值是安全的,以避免 SQL 注入攻击。 3. 使用第三方扩展库或包:有一些第三方库或包可以帮助你更方便地实现批量插入数据,例如 `EntityFrameworkCore.BulkExtensions`、`Z.EntityFramework.Extensions` 等。这些包提供了特定的方法或扩展,使得批量插入数据更加简单和高效。你可以根据需要选择合适的扩展库来使用。 以上是几种常见的在EF Core中实现批量插入数据的方法,你可以根据你的具体需求选择合适的方式来处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值