WebAPI EF更新30,000行数据非常慢

时间:2016-08-12 20:15:22

标签: sql-server entity-framework asp.net-web-api

我正在尝试让我的asp.net WebAPI Web服务读取.csv并使用Entity Framework更新数据库。 .csv文件大约有20,000-30,000行。

截至目前,我正在使用TextfieldParser来阅读.csv.csv文件的每一行我创建一个新对象,然后将对象添加到EF上下文。

完成将所有行添加到上下文后,我调用db.SaveChanges();

观察控制台我注意到它为每一行调用了一个更新语句......这需要很长时间。有没有更好的方法来实现这一目标?

if (filetype == "xxx")
{
    using (TextFieldParser csvReader = new TextFieldParser(downloadFolder + fileName))
    {
        csvReader.SetDelimiters(new string[] { "," });
        csvReader.HasFieldsEnclosedInQuotes = true;

        int rowCount = 1;

        while (!csvReader.EndOfData)
        {
            string[] fieldData = csvReader.ReadFields();

            //skip header row
            if (rowCount != 1)
            {                           
                var t = new GMI_adatpos
                        {
                            PACCT = fieldData[3]
                        };

                db.GMI_adatpos.Add(t);
            }

            rowCount++;
        }
    }
}

db.SaveChanges();

1 个答案:

答案 0 :(得分:2)

因为添加到DbContext的项目数非常多,所以ram空间逐渐填充,并且操作非常慢。因此,在几条记录(ex 100)之后调用SaveChanges Methods并更新DbContext更好。

if (filetype == "xxx")
{
    using (TextFieldParser csvReader = new TextFieldParser(downloadFolder + fileName))
    {
        csvReader.SetDelimiters(new string[] { "," });
        csvReader.HasFieldsEnclosedInQuotes = true;

        int rowCount = 1;

        while (!csvReader.EndOfData)
        {
            if(rowCount%100 == 0)
            {
                db.Dispose();
                db.SaveChanges();
                db = new AppDbContext();//Your DbContext
            }

            string[] fieldData = csvReader.ReadFields();

            //skip header row
            if (rowCount != 1)
            {                           
                var t = new GMI_adatpos
                        {
                            PACCT = fieldData[3]
                        };

                db.GMI_adatpos.Add(t);
            }

            rowCount++;
        }
    }
}