Mr.*_*ome 3 c# entity-framework
这里有很多关于 EF 的文章需要很长时间才能保存,但我浏览了它们并使用了他们的答案,但似乎仍然得到非常慢的结果。
我的代码看起来像这样:
using (MarketingEntities1 db = new MarketingEntities1())
{
//using (var trans = db.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
//{
int count = 0;
db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;
while (count < ranges.Count)
{
if (bgw != null)
{
bgw.ReportProgress(0, "Saving count: " + count.ToString());
}
db.Set<xGeoIPRanx>().AddRange(ranges.Skip(count).Take(BATCHCOUNT));
db.SaveChanges();
count+=BATCHCOUNT;
}
//trans.Commit();
//}
}
Run Code Online (Sandbox Code Playgroud)
每个批次需要 30 秒以上才能完成。BatchCount 是 1000。我知道 EF 并没有那么慢。你可以看到我已经停止使用事务,我已经取消了跟踪,但这些似乎都没有帮助。
更多信息:
xGeoIpRanx 是一个空表,没有 PK(我不确定它会有多大帮助)。我正在尝试插入大约 1000 万个范围。
编辑:
我觉得很愚蠢,但我尝试使用bulkInsert,但我不断收到此实体不存在的错误,我查看了这段代码
using (var ctx = GetContext())
{
using (var transactionScope = new TransactionScope())
{
// some stuff in dbcontext
ctx.BulkInsert(entities);
ctx.SaveChanges();
transactionScope.Complete();
}
}
Run Code Online (Sandbox Code Playgroud)
什么是“实体”我尝试了实体列表,但不起作用,那是什么数据类型?
nvm 它按预期工作,由于我生成 edmx 文件的方式,这是一个奇怪的错误
在负载下暂停调试器 10 次,然后查看包括外部代码在内的堆栈。最常停在哪里?
。
.SaveChanges() 花费了很长时间。仅通过一些快速测试,ADO.net 代码
这意味着网络延迟和服务器执行时间导致了这种情况。对于插入服务器执行时间通常不会那么长。您无法使用 EF 对网络延迟采取任何措施,因为它每次插入都会发送一批。(是的,这是框架的缺陷。)。
不要使用 EF 进行批量工作。考虑使用表值参数或SqlBulkCopy任何其他批量插入方式,例如评论中Aducci 的提案。
| 归档时间: |
|
| 查看次数: |
3388 次 |
| 最近记录: |