【发布时间】:2014-08-13 16:19:34
【问题描述】:
这里有很多关于 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(我不确定它有多大帮助)。我正在尝试插入大约 1000 万个范围。
编辑:
我觉得很愚蠢,但我尝试使用 bulkInsert 并且我不断收到此实体不存在错误,我查看此代码
using (var ctx = GetContext())
{
using (var transactionScope = new TransactionScope())
{
// some stuff in dbcontext
ctx.BulkInsert(entities);
ctx.SaveChanges();
transactionScope.Complete();
}
}
什么是“实体”我尝试了我的实体列表,但不起作用,那是什么数据类型?
nvm 它按预期工作,由于我生成 edmx 文件的方式,这是一个奇怪的错误
【问题讨论】:
-
好吧,分析应用程序以查看需要时间的内容。可以是任何东西。在负载下暂停调试器 10 次,并查看包括外部代码在内的堆栈。它最常停在哪里?我不明白为什么批处理会在这里改善任何事情。对所有事情都使用一批。
-
您的数据库服务器和 Web 服务器在同一个本地网络上吗?如果您从本地工作站进行调试,并且 SQL 服务器在数据中心的异地,那么这将非常慢。 EF 是“健谈”的,因为它会执行很多小的 SQL 语句,因此延迟将是一个问题。
-
@usr 它在 .SaveChanges() 上花费了很长时间我也将它批处理以进行调试,以查看它是否正在保存。
-
@Mangist 它不在现场,我们通过 vpn 连接到它
-
我会用EntityFramework.BulkInsert 它超级快
标签: c# entity-framework