Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在数据库实体上运行快速计算_C#_Sql Server_Entity Framework_Asp.net Mvc 4 - Fatal编程技术网

C# 在数据库实体上运行快速计算

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”类型实体的计算取决于在

我们正在使用EntityFramework6和SQLServer在.NET4.5框架上开发一个asp.NETMVC4项目

我们需要对从数据库(几千个)检索到的实体(类型为“A”)进行计算(几乎我们上传的每个新版本)。因此,我们在seed方法中添加了一些代码(它运行每个应用程序启动),并使用一个简单的foreach循环得到了不令人满意的结果。(每个实体大约2秒)

当我们尝试将seed方法中的代码移动到并行运行时,我们得到了很多错误的结果,并且抛出了expetion

(对“A”类型实体的计算取决于在运行时从数据库加载或急切加载的更多实体。(两者都尝试过)

我读过关于EF和并行性的文章,我知道这不是一个好主意,但我仍然需要关于如何改进这个结果的建议

我应该在并行执行上做更多的工作,还是继续这样做是错误的

代码示例:

                 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、 并行性可能不是答案……但是,除非你抓住了真正的瓶颈,否则你不会知道这一点

这就是我要开始的地方

  • 由于您正在执行即时加载,请确定它是否真的有效。是否存在大量到数据库的往返。您可能正在使用需要延迟加载的实体。请使用SQL Profiler或EF6分析

  • 如果已确定数据库的往返不是问题…则使用Visual Studio分析代码以确定CPU瓶颈


  • 然后从那里开始工作。

    这是关于批量更新的吗?跳过EF并运行批量更新语句。或者实现存储过程或其他任何东西……ORM不适合批量操作……即使您获得了正确的并行性,它也只会提高性能一个因素……使用存储过程,您在任何情况下都会获得更快的结果有几种方法可以提高Entity Framework中批量操作的性能,但是如果没有一些代码示例,就很难给出适合您的场景的建议。例如,您可以关闭上下文更改检测,这会增加开销;
    context.Configuration.AutoDetectChangesEnabled=false;
    .Just确保在完成批量操作时重新打开它……您还可以在实体上使用
    AsNoTracking()
    ,或者,正如其他人所建议的,使用存储过程。