这里有很多关于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文件
,这是一个奇怪的错误答案 0 :(得分:4)
在负载下暂停调试器10次并查看堆栈,包括 外部代码。它最常停在哪里?
它花了很长时间在.SaveChanges()上。只是从一些快速测试,ADO.net代码
这意味着网络延迟和服务器执行时间正在导致此问题。对于插入服务器,执行时间通常不是那么高。您无法对使用EF的网络延迟执行任何操作,因为它会为每个插入发送一个批处理。 (是的,这是框架的缺陷。)。
不要使用EF进行批量工作。请考虑使用表格值参数或SqlBulkCopy
或任何其他批量插入方式,例如评论中的Aducci's proposal。