我正在寻找插入Entity Framework的最快方法.
我问这个是因为你有一个活跃的TransactionScope并且插入很大(4000+).它可能持续超过10分钟(事务的默认超时),这将导致事务不完整.
基本上,我在一个事务中插入35000个对象:
using(var uow = new MyContext()){
for(int i = 1; i < 35000; i++) {
var o = new MyObject()...;
uow.MySet.Add(o);
}
uow.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
这需要永远!如果我使用底层ObjectContext(通过使用IObjectAdapter),它仍然很慢但需要大约20秒.它似乎DbSet<>正在进行一些线性搜索,这需要花费大量时间......
其他人看到这个问题?
为什么async在单个事务上针对不相关的表并行运行多个 SqlBulkCopy 插入看起来就像串行运行一样?
我有一些代码正在计算和存储大量数据。计算是预先完成的,因此代码的存储部分得到了要存储的一大堆数据。
我的数据库写入正在完成,SqlBulkCopy.WriteToServerAsync一般来说,它可以很好地完成工作。
我需要存储6个与业务相关的表,但与SQL无关。因此,我对它们的写入需要在一个事务中进行,以便任何一个写入上的错误都会恢复所有其他写入上的写入。
该代码的性能相当关键,因此我希望能够并行运行 BulkInsert。没有 FKey 或任何其他与之交互的表(数据完整性由代码管理),因此我看不出有任何理由认为这是不可能的。
我以为我知道如何编写所有代码并且能够使其全部正常工作,但是有一个我不明白的奇怪的性能下降:
很高兴提供您想要的实际代码位,但这已经是一个很长的 Q,并且代码会很长到 0。如果你确实想看什么,LMK。
我可以写:
“按顺序批量插入到每个表中,全部在单个事务中”。
new SqlConnection()and .BeginTransaction(),foreach翻了6张桌子,await InsertToTable(transaction)每张桌子都移动foreach到下一张桌子。foreach结束时我.Commit()进行事务并关闭连接。“按顺序批量插入每个表,每个表都有一个新的连接和事务。”
foreach遍历了 6 个表,并且await InsertToTable()每个表在foreach移动到下一个表之前。InsertToTable()调用中,我都会打开一个新的SqlConnectionand BeginTransaction,然后在从方法返回之前打开.Commit()一个 and 。.Close()