如何在Entity Framework中绕过插入失败的对象?

时间:2017-10-25 04:27:02

标签: entity-framework batch-insert

在我的一个项目中,使用了实体框架。

我遇到了表现糟糕的情况。当有多个记录需要逐个插入表格时, 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进行操作。

1 个答案:

答案 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,这非常快。