C# 在数据库实体上运行快速计算
我们正在使用EntityFramework6和SQLServer在.NET4.5框架上开发一个asp.NETMVC4项目 我们需要对从数据库(几千个)检索到的实体(类型为“A”)进行计算(几乎我们上传的每个新版本)。因此,我们在seed方法中添加了一些代码(它运行每个应用程序启动),并使用一个简单的foreach循环得到了不令人满意的结果。(每个实体大约2秒) 当我们尝试将seed方法中的代码移动到并行运行时,我们得到了很多错误的结果,并且抛出了expetion (对“A”类型实体的计算取决于在运行时从数据库加载或急切加载的更多实体。(两者都尝试过) 我读过关于EF和并行性的文章,我知道这不是一个好主意,但我仍然需要关于如何改进这个结果的建议 我应该在并行执行上做更多的工作,还是继续这样做是错误的 代码示例:C# 在数据库实体上运行快速计算,c#,sql-server,entity-framework,asp.net-mvc-4,C#,Sql Server,Entity Framework,Asp.net Mvc 4,我们正在使用EntityFramework6和SQLServer在.NET4.5框架上开发一个asp.NETMVC4项目 我们需要对从数据库(几千个)检索到的实体(类型为“A”)进行计算(几乎我们上传的每个新版本)。因此,我们在seed方法中添加了一些代码(它运行每个应用程序启动),并使用一个简单的foreach循环得到了不令人满意的结果。(每个实体大约2秒) 当我们尝试将seed方法中的代码移动到并行运行时,我们得到了很多错误的结果,并且抛出了expetion (对“A”类型实体的计算取决于在
var assets = context.Assets
.Include(x => x.YitraLefiGilPrisha)
.Include(x => x.ZihuiKisui)
.Include(x => x.PirteiTaktziv.Select(p => p.Yitrot.Select(y => y.PerutYitrot)))
.Include(x => x.PirteiTaktziv.Select(p => p.PerutMivneDmeiNihul))
.Include(x => x.PirteiTaktziv.Select(p => p.PirteiOved))
.Include(x => x.PirteiTaktziv.Select(p => p.PirteiHaasaka))
.ToList();
foreach (var asset in assets)
{
Logger.Debug("Running Procedures on asset : " + asset.Id);
repo.RunProceduresAndCalculationsOnAsset(asset);
Logger.Debug("Finished Running on asset : " + asset.Id);
}
包括RunProceduresAndCalculationsOnAsset的源代码会有所帮助 a、 放弃EF不是答案……它只是通往数据库的管道。 b、 并行性可能不是答案……但是,除非你抓住了真正的瓶颈,否则你不会知道这一点 这就是我要开始的地方
然后从那里开始工作。这是关于批量更新的吗?跳过EF并运行批量更新语句。或者实现存储过程或其他任何东西……ORM不适合批量操作……即使您获得了正确的并行性,它也只会提高性能一个因素……使用存储过程,您在任何情况下都会获得更快的结果有几种方法可以提高Entity Framework中批量操作的性能,但是如果没有一些代码示例,就很难给出适合您的场景的建议。例如,您可以关闭上下文更改检测,这会增加开销;
context.Configuration.AutoDetectChangesEnabled=false;
.Just确保在完成批量操作时重新打开它……您还可以在实体上使用AsNoTracking()
,或者,正如其他人所建议的,使用存储过程。