我正在寻找一种不使用扩展程序来保存数千条记录(10K +)的方法。有关如何在合理的执行时间内批量更新此数据量的任何想法?
我当前的问题是,在调用dbContext.SaveChanges()时,它会将所有记录保存在内存中,而不仅仅是修改后的记录,只有在修改了大约10K记录时才会更新20K +记录。
答案 0 :(得分:1)
你说你不想使用SqlBulkCopy,所以我的答案是:AFAIK你无法在高效时间内使用EF插入|更新那些记录。
无论如何这里是SqlBulkCopy
的一个例子DataTable dt = new DataTable("Table");
dt = GetDataTableFromSomewhereElse();
using (SqlConnection conn = new SqlConnection("YourConnectionString"))
{
using (SqlCommand command = new SqlCommand("", conn))
{
try
{
conn.Open();
command.CommandText = @"Create Table #TmpTable(
[Col1] [int] NOT NULL,
[Col2] [nvarchar](max) NOT NULL,
[Col3] [decimal](18, 2) NOT NULL)";
command.ExecuteNonQuery();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
{
bulkCopy.BulkCopyTimeout = 660;
bulkCopy.DestinationTableName = "#TmpTable";
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Col1", "Col1"));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Col2", "Col2"));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Col3", "Col3"));
bulkCopy.WriteToServer(dt);
bulkCopy.Close();
}
command.CommandTimeout = 300;
command.CommandText = $@"MERGE INTO Table p
USING #TmpTable t ON p.Col1 = t.Col1
WHEN MATCHED THEN UPDATE SET
p.Col2 = t.Col2,
p.Col3 = t.Col3,
WHEN NOT MATCHED THEN
INSERT VALUES(
t.Col1,
t.Col2,
t.Col3
);
Drop Table #TmpTable;";
command.ExecuteNonQuery();
}
catch (Exception ex)
{
...
}
}
}
只是为了给你一个见解,当我试图更新|使用EF插入14000行时,花了..."永远"完成,同时使用SQLBulkCopy需要大约2-3秒