在我的一个项目中,使用了实体框架。
我遇到了表现糟糕的情况。当有多个记录需要逐个插入表格时, 50~500 不是很确定但非常大。
起初,我用过:
dbcontext.Adds.Add(alist);
进行插入。但很快我发现,一旦有一个对象存在无效数据且无法正确插入数据库,则无法插入任何数据!所有数据彼此相关,不能绕过任何不正确的数据。
这是我的解决方案:
foreach(var a in alist)
{
//...
try
{
dbcontext.Adds.Add(a);
dbcontext.SaveChanges();
}
catch (Exception ex)
{
// just log and bypass one by one
log4net.LogManager.GetLogger("NOTSAVE").Info(a.ToString());
}
}
现在,它运作正常。
但是有一个很大的问题,表现很可怕!客户端可能会等待几秒钟来执行每个操作。自定义反馈也更糟糕。
有谁知道提高性能的其他解决方案?最好在500ms~1秒内完成。但现在一旦记录> 100每次可能花费超过1秒。因此,客户的明显和频繁的暂停都会通过UI进行操作。
答案 0 :(得分:0)
您可以做的第一件也是重要的事情是关闭AutoDetectChangesEnabled
,这会对性能产生巨大影响。
dbcontext.Configuration.AutoDetectChangesEnabled = false;
foreach(var a in alist)
{
//...
try
{
dbcontext.Adds.Add(a);
dbcontext.SaveChanges();
}
catch (Exception ex)
{
// just log and bypass one by one
log4net.LogManager.GetLogger("NOTSAVE").Info(a.ToString());
}
}
dbcontext.Configuration.AutoDetectChangesEnabled = true;
阅读这篇文章了解更多信息:EntityFramework Performance and AutoDetectChanges
您可以使用第三方库:
您可以在System.Data.SqlClient.SqlBulkCopy
中使用ADO.NET
,这非常快。