ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何在C#的递归函数或其他可用选项中使用db.savechange()函数提高实体框架中数据保存的性能?

2019-11-08 06:05:50  阅读:148  来源: 互联网

标签:entity-framework-6 c asp-net-mvc


我正在使用递归函数来保存和更新记录,但是它花费了太多时间-大约需要2分钟才能保存记录.我正在使用实体框架进行数据库访问.

欢迎使用Entity Framework准则最佳做法

有N个孩子,所以我们不知道有多少个孩子
我已经尝试了递归完成后调用db.savechange(),但是对此没有运气.

我有这种类型的代码框架(它不是原始的,我只是添加了结构).

public void parentFunction(List<DataListforupdate> dataListforupdates, string defaultvalue, Guid perentguid)
{
    if (dataListforupdates != null && dataListforupdates.Count() >)
    {
        foreach (var model in dataListforupdates)
        {
            // manipulate data for save
            saveDateInDB(model.value, model.value, model.value, model.value);

            if (model.child.count() > 0)
            {
                ChildFunction(model.child.dataListforupdates, defaultvalue, perentguid)
            }
        }
    }
    else
    {
        var getAllDataForupdate = db.tbl.where(x => x.gID = perentguid).toList();

        foreach (var model in getAllDataForupdate)
        {
            // manipulate data for save
            saveDateInDB(defaultvalue, model.value, model.value, model.value);

            if (model.child.count() > 0)
            {
                ChildFunction(model.child.dataListforupdates, defaultvalue, perentguid)
            }
        }
    }
}

public void ChildFunction(List<DataListforupdate> dataListforupdates, string defaultvalue, Guid perentguid)
{
    // update model date if its not null
    if (dataListforupdates != null && dataListforupdates.Count() >)
    {
        foreach (var model in dataListforupdates)
        {
            // manipulate data for save
            saveDateInDB(model.value, model.value, model.value, model.value);

            if (model.child.count() > 0)
            {
                ChildFunction(model.child.dataListforupdates, defaultvalue, perentguid)
            }
        }
    }
    // if model date is null then update all record with default value 
    else
    {
        var getAllDataForupdate = db.tbl.where(x => x.gID = perentguid).toList();

        foreach (var model in getAllDataForupdate)
        {
            // manipulate data for save
            saveDateInDB(defaultvalue, model.value, model.value, model.value);

            if (model.child.count() > 0)
            {
                ChildFunction(model.child.dataListforupdates, defaultvalue, perentguid)
            }
        }
    }
}

public void saveDateInDB(string value1, string value2, string value3, string value4)
{
    var getAddedData = db.DataFromTable.where(x => x.id = value1).FirstOrDefault()

    if (getAddedData != null)
    {
        // update date using db.savechanges()
    }
    else
    {
        // Add date using db.savechanges()
    }
}

是因为我在每个递归中都调用db获取列表的速度问题?

解决方法:

I have tried call db.savechange() after completion of recursive but
no luck for this.

SavingChanges()一次想提高应用程序性能,而不是对每个孩子进行savechanges.它没有任何意义.在递归时,您只应将实体的状态更改为已修改.您也可以禁用更改跟踪.

Configuration.AutoDetectChangesEnabled = false;
context.Entry(entity).State = EntityState.Modified;

另外,您应该一次从数据库获取所有数据.在递归时,您不应进入数据库.这不是最佳实践.

标签:entity-framework-6,c,asp-net-mvc
来源: https://codeday.me/bug/20191108/2006019.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有