如何优化在Entity Framework中保存多个记录而不扩展?

时间:2017-09-19 14:51:53

标签: entity-framework optimization dbcontext

我正在寻找一种不使用扩展程序来保存数千条记录(10K +)的方法。有关如何在合理的执行时间内批量更新此数据量的任何想法?

我当前的问题是,在调用dbContext.SaveChanges()时,它会将所有记录保存在内存中,而不仅仅是修改后的记录,只有在修改了大约10K记录时才会更新20K +记录。

1 个答案:

答案 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秒