多次插入后,EF(6.1.3)上下文表记录计数为0

时间:2016-03-25 22:23:28

标签: vb.net entity-framework

我正在尝试从XML文件中进行批量插入(解析和分析)。我在VB.net中使用Entity Framework 6.1.3。

XML文件的处理(不保存)大约需要6.5分钟才能运行。通过谷歌搜索我找到了

ctx.Configuration.AutoDetectChangesEnabled = False

将处理时间降至15秒!万岁!

问题是,当我到达ctx.SaveChanges()时,将数据写入数据库需要20多分钟!它只是用单个Insert语句充斥SQL服务器。为了提高效率,我想做一个BulkInsert。我遇到了几个不同的选项,包括SQLBulkCopy和我目前使用的EFUtilities。我的代码如下:

        Using ctx As New MyContext()

            For Each dp As XElement In de.Elements

                Party = New DistinctParty()
                With Party
                    .Comment = dp.<d:Comment>.Value
                    .ListID = ListType
                End With

                ctx.DistinctParties.Add(Party)

                AddAliases(dp.<d:Profile>.<d:Identity>.FirstOrDefault(), ctx)
                AddFeatures(dp.<d:Profile>.<d:Feature>, ctx)

            Next

            ' Save the items

            Dim DPs As List(Of Integer)
            DPs = ctx.DistinctParties.Where(Function(x) x.ListID = ListType).Select(Function(x) x.DistinctPartyID).ToList

            EFBatchOperation.For(ctx, ctx.DistinctParties).InsertAll(ctx.DistinctParties.Where(Function(x) x.ListID = ListType))
            EFBatchOperation.For(ctx, ctx.DistinctPartyAliases).InsertAll(ctx.DistinctPartyAliases.Where(Function(x) DPs.Contains(x.DistinctPartyID)))
            EFBatchOperation.For(ctx, ctx.DistinctPartyFeatures).InsertAll(ctx.DistinctPartyFeatures.Where(Function(x) DPs.Contains(x.DistinctPartyID)))

            'ctx.SaveChanges()

        End Using

ctx.SaveChanges()可以正常使用。只需20分钟 问题是,DPs.Count为0!如果我在代码中先前删除它们之前在数据库中有旧记录,则DP是数据库中WAS的数据计数。

问题:当3个不同的表的上下文中确实存在数据时,为什么DPs.Count = 0?

相关问题:这是进行批量插入的正确方法吗?

1 个答案:

答案 0 :(得分:2)

问题:当3个不同的表格的上下文中确实有数据时,为什么DPs.Count = 0?

当您使用LINQ Queryable时,结果(计数,首先等)取自当前数据库中的内容,并不关心上下文/更改跟踪器中的内容类似于&#34;待定&#34;的列表等待提交/保存到数据库的实体。

因此,即使您在上下文中添加了数千个实体(尚未保存),如果数据库有0条记录,则计数等于0的原因

相关问题:这是批量插入的正确方法吗?

有三个主要库支持批量插入,您可以阅读我的Bulk Insert Library Reviews & Comparisons

简而言之,我建议Entity Framework Extensions优于其他库,因为它是唯一真正支持的库,并且比其他库具有更大的灵活性:批量插入,更新,删除,合并和BulkSaveChanges。

免责声明:我是该项目的所有者Entity Framework Extensions