这里有很多关于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();
//}
}每一批都需要30+秒才能完成。BatchCount是1000。我知道EF没那么慢。您可以看到,我已经停止使用事务,我已经删除跟踪,似乎没有任何帮助。
更多信息:
xGeoIpRanx是一个空表,没有PK(我不确定它会有多大帮助)。我在试着插入大约10百万的范围。
编辑:
我觉得自己很蠢,但我试着使用bulkInsert并不断地获得这个实体不存在错误,我看了下面的代码
using (var ctx = GetContext())
{
using (var transactionScope = new TransactionScope())
{
// some stuff in dbcontext
ctx.BulkInsert(entities);
ctx.SaveChanges();
transactionScope.Complete();
}
}什么是“实体”?我尝试了我的实体列表,它不起作用,那是什么数据类型?
nvm它的工作方式与预期一样,这是一个奇怪的错误,因为我是如何生成edmx文件的。
发布于 2014-08-13 17:14:04
在加载下暂停调试器10次,查看堆栈,包括外部代码。它最常停在哪里?
。
在.SaveChanges()上花了很长时间。只是通过一些快速测试,ADO.net代码
这意味着网络延迟和服务器执行时间导致了这种情况。对于插入,服务器执行时间通常不是那么高。您不能使用EF对网络延迟做任何处理,因为它每插入一次发送一批。(是的,这是框架的缺陷。)
不要将EF用于批量工作。考虑使用表值参数或SqlBulkCopy或任何其他批量插入方法(如从注释中插入阿杜西的建议 )。
https://stackoverflow.com/questions/25291265
复制相似问题