[英]entity framework save taking a long time
这里有很多关于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文件的方式,这是一个奇怪的错误
在负载下暂停调试器10次并查看包含外部代码的堆栈。 它最经常停在哪里?
。
它花了很长时间在.SaveChanges()上。 只是从一些快速测试,ADO.net代码
这意味着网络延迟和服务器执行时间正在导致此问题。 对于插入服务器,执行时间通常不是那么高。 您无法对使用EF的网络延迟执行任何操作,因为它会为每个插入发送一个批处理。 (是的,这是框架的缺陷。)。
不要使用EF进行批量工作。 考虑使用表值参数或SqlBulkCopy
或任何其他批量插入方式,例如评论中的Aducci提议 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.