C# 实体框架性能缓慢

C# 实体框架性能缓慢,c#,performance,entity-framework,entity-framework-6,C#,Performance,Entity Framework,Entity Framework 6,我们使用EF6.0、.NET4.5,并使用代码优先的方法,我们的数据库有大约170个实体表,主表包含大约150000条记录 第一次加载实体框架大约需要25秒。 这一次我试图改进,因为这太慢了,而且随着记录数量的增加,速度也变慢了。 我曾尝试生成本机图像,尝试使用预生成的交互式视图,但没有取得任何显著的改进 有人能帮我吗 谢谢。 可以考虑实体框架预生成映射视图。可以使用EF POWER工具创建预生成视图。 使用预生成的视图可以降低从模型生成视图的成本 将运行时加载到编译时。虽然这改善了启动 性能在

我们使用EF6.0、.NET4.5,并使用代码优先的方法,我们的数据库有大约170个实体表,主表包含大约150000条记录 第一次加载实体框架大约需要25秒。 这一次我试图改进,因为这太慢了,而且随着记录数量的增加,速度也变慢了。 我曾尝试生成本机图像,尝试使用预生成的交互式视图,但没有取得任何显著的改进

有人能帮我吗

谢谢。

可以考虑实体框架预生成映射视图。可以使用EF POWER工具创建预生成视图。

使用预生成的视图可以降低从模型生成视图的成本 将运行时加载到编译时。虽然这改善了启动 性能在运行时,您仍然会经历查看的痛苦 当你在发展的时候,你的一代人。还有几个额外的问题 有助于降低视图生成成本的技巧,包括 编译时和运行时

您可以参考以下内容了解更多信息:

您可以在实体框架中使用缓存来提高应用程序的性能

有3种类型的缓存

一,。对象缓存–内置在ObjectContext中的ObjectStateManager 实例在内存中跟踪已创建的对象 使用该实例检索。这也被称为第一级 缓存

二,。查询计划缓存-在查询时重用生成的store命令 查询被多次执行

三,。元数据缓存-跨不同的数据库共享模型的元数据 连接到同一型号


您可以参考本文了解更多信息:

我最近有一个简单的查询,在正在进行的SSMS中运行得非常快,在我的C程序中使用实体框架运行的时间太长了

在一般情况下解决EF性能问题时,此页面非常有用:

…但在这种情况下,没有任何帮助。所以最后,我做了这个:

        List<UpcPrintingProductModel> products = new List<UpcPrintingProductModel>();
        var sql = "select top 75 number, desc1, upccode "
                + "from MailOrderManager..STOCK s "
                + "where s.number like @puid + '%' "
        ;
        var connstring = ConfigurationManager.ConnectionStrings["MailOrderManagerContext"].ToString();
        using (var connection = new SqlConnection(connstring))
        using (var command = new SqlCommand(sql, connection)) {
            connection.Open();
            command.Parameters.AddWithValue("@puid", productNumber);
            using (SqlDataReader reader = command.ExecuteReader()) {
                while (reader.Read()) {
                    var product = new UpcPrintingProductModel() {
                        ProductNumber = Convert.ToString(reader["number"]),
                        Description = Convert.ToString(reader["desc1"]),
                        Upc = Convert.ToString(reader["upccode"])
                    };
                    products.Add(product);
                }
            }
        }
对于这个特定的查询,我完全绕过了EF,使用了旧的备用:System.Data.SqlClient


你可以厌恶地皱起鼻子;我当然这样做了,但实际上编写并不需要那么长时间,而且它几乎可以立即执行。

您还可以在应用程序启动时异步地加热dbcontext来避免这个问题

protected void Application_Start()
 {
   // your code.
    // Warming up.
            Start(() =>
            {
                using (var dbContext = new SomeDbContext())
                { 
                    // Any request to db in current dbContext.
                    var response1 = dbContext.Addresses.Count();
                }
            });
 }

 private void Start(Action a)
 {
    a.BeginInvoke(null, null);
 }
我还建议使用以下设置:如果它们适合您的应用程序

dbContext.Configuration.AutoDetectChangesEnabled=false; dbContext.Configuration.LazyLoadingEnabled=false; dbContext.Configuration.ProxyCreationEnabled=false

跳过验证部分ie Database.SetInitializerFull

在GET查询上使用.asNoTraking

有关更多信息,您可以阅读:


在某些情况下,EF不使用查询计划缓存。例如,如果在查询中使用contans、any、all方法或常量。你可以试试。它可以转换允许EF use cahce的查询表达式。

确保启用了延迟加载。您是否真的使用了代码中的所有170个表?能否显示一个需要很长时间才能完成的示例查询?@asdf_enel_hak是的,延迟加载是enabled@ErikEJ是的,我们需要所有这些,这是一个不断增长的数据模型。我尝试过使用预生成的视图,没有帮助。我会尝试缓存选项。皱起我的鼻子?!这真是太聪明了+1将EF用于主流,并在合理的情况下,在例外情况中使用分歧。这是约定优于配置的一个极好的例子。