我正在尝试让我的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();
答案 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++;
}
}
}