我正在尝试从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?
相关问题:这是进行批量插入的正确方法吗?
答案 0 :(得分:2)
问题:当3个不同的表格的上下文中确实有数据时,为什么DPs.Count = 0?
当您使用LINQ Queryable时,结果(计数,首先等)取自当前数据库中的内容,并不关心上下文/更改跟踪器中的内容类似于&#34;待定&#34;的列表等待提交/保存到数据库的实体。
因此,即使您在上下文中添加了数千个实体(尚未保存),如果数据库有0条记录,则计数等于0的原因
相关问题:这是批量插入的正确方法吗?
有三个主要库支持批量插入,您可以阅读我的Bulk Insert Library Reviews & Comparisons
简而言之,我建议Entity Framework Extensions优于其他库,因为它是唯一真正支持的库,并且比其他库具有更大的灵活性:批量插入,更新,删除,合并和BulkSaveChanges。
免责声明:我是该项目的所有者Entity Framework Extensions