C# 使用实体框架6的初始负载和性能问题

C# 使用实体框架6的初始负载和性能问题,c#,.net,performance,entity-framework,memory-management,C#,.net,Performance,Entity Framework,Memory Management,我在应用程序中使用了EntityFramework6和数据库优先的方法。我在上下文的构造函数中添加了一个日志记录方法: Database.Log = sql=>Debug.WriteLine(sql); 似乎在新上下文的每个实例中,都会加载表的结构和数据。这导致了性能问题,主界面的加载需要几秒钟 所以我需要知道: 这是实体框架6的默认行为吗:当我实例化上下文时,模型中的所有表和视图都将加载到内存中(结构和数据) 如果这是真的,我如何通过只加载表的结构来改变这一点,当我像这样调用上下文时,

我在应用程序中使用了EntityFramework6和数据库优先的方法。我在上下文的构造函数中添加了一个日志记录方法:

Database.Log = sql=>Debug.WriteLine(sql);
似乎在新上下文的每个实例中,都会加载表的结构和数据。这导致了性能问题,主界面的加载需要几秒钟

所以我需要知道:

  • 这是实体框架6的默认行为吗:当我实例化上下文时,模型中的所有表和视图都将加载到内存中(结构和数据)
  • 如果这是真的,我如何通过只加载表的结构来改变这一点,当我像这样调用
    上下文时,数据将被加载
  • 如果无法更改此默认行为,那么为
    Dbcontext
    实现
    Singleton
    是否是解决此问题的好方法
  • 编辑

    这是我的代码:我有一个控制台应用程序,其中添加了我的EF模型

     class Program
        {
            static void Main(string[] args)
            {
                Action empBasicAction ;
                Console.WriteLine("Début de programme");
    
                Console.WriteLine("Chargement de context1 ......");
                empBasicAction = () => { 
                    Entities contexte = new Entities();
                };
                Console.WriteLine("fin de chargement1, temps = " + CalculateTime(empBasicAction));
    
                Console.WriteLine("Chargement de context2 ......");
                empBasicAction = () => { 
                    Entities contexte = new Entities();
                };
                Console.WriteLine("fin de chargement2, temps = " + CalculateTime(empBasicAction));
    
    
                Console.WriteLine("Chargement de context3 ......");
                 empBasicAction = () =>
                {
                    Entities contexte = new Entities();
                };
    
                Console.WriteLine("fin de chargement3, temps = " + CalculateTime(empBasicAction));
    
    
                Console.WriteLine("Sélection sur une table ......");
                empBasicAction = () =>
                {
                    Entities contexte1 = new Entities();
                    contexte1.fsign_fiche_signaletique.Count();
                };
    
                Console.WriteLine("fin de sélection, temps = " + CalculateTime(empBasicAction));
    
                Console.WriteLine("Sélection2 sur une table ......");
                empBasicAction = () =>
                {
                    Entities contexte1 = new Entities();
                    contexte1.fsign_fiche_signaletique.Count();
                };
    
                Console.WriteLine("fin de sélection2, temps = " + CalculateTime(empBasicAction));
    
                Console.ReadLine();
    
    
            }
    
            public static long CalculateTime(Action  t)
            {
                Stopwatch alarme = new Stopwatch();
                alarme.Start();
                t();
                alarme.Stop();
                return alarme.ElapsedMilliseconds;
    
            }
        }
    
    控制台输出

     Début de programme
    Chargement de context1 ......
    fin de chargement1, temps = 434
    Chargement de context2 ......
    fin de chargement2, temps = 0
    Chargement de context3 ......
    fin de chargement3, temps = 0
    Sélection sur une table ......
    fin de sélection, temps = 4265
    Sélection2 sur une table ......
    fin de sélection2, temps = 19
    
    Opened connection at 12/02/2016 12:26:49 +01:00
    
    SELECT 
        [GroupBy1].[A1] AS [C1]
        FROM ( SELECT 
            COUNT(1) AS [A1]
            FROM [dbo].[fsign_fiche_signaletique] AS [Extent1]
        )  AS [GroupBy1]
    
    
    -- Executing at 12/02/2016 12:26:52 +01:00
    
    -- Completed in 10 ms with result: SqlDataReader
    
    
    
    Closed connection at 12/02/2016 12:26:52 +01:00
    
    Opened connection at 12/02/2016 12:26:52 +01:00
    
    SELECT 
        [GroupBy1].[A1] AS [C1]
        FROM ( SELECT 
            COUNT(1) AS [A1]
            FROM [dbo].[fsign_fiche_signaletique] AS [Extent1]
        )  AS [GroupBy1]
    
    
    -- Executing at 12/02/2016 12:26:52 +01:00
    
    -- Completed in 5 ms with result: SqlDataReader
    
    
    
    Closed connection at 12/02/2016 12:26:52 +01:00
    
    The program '[4316] ConsoleApplication1.vshost.exe' has exited with code -1073741510 (0xc000013a).
    
    输出

     Début de programme
    Chargement de context1 ......
    fin de chargement1, temps = 434
    Chargement de context2 ......
    fin de chargement2, temps = 0
    Chargement de context3 ......
    fin de chargement3, temps = 0
    Sélection sur une table ......
    fin de sélection, temps = 4265
    Sélection2 sur une table ......
    fin de sélection2, temps = 19
    
    Opened connection at 12/02/2016 12:26:49 +01:00
    
    SELECT 
        [GroupBy1].[A1] AS [C1]
        FROM ( SELECT 
            COUNT(1) AS [A1]
            FROM [dbo].[fsign_fiche_signaletique] AS [Extent1]
        )  AS [GroupBy1]
    
    
    -- Executing at 12/02/2016 12:26:52 +01:00
    
    -- Completed in 10 ms with result: SqlDataReader
    
    
    
    Closed connection at 12/02/2016 12:26:52 +01:00
    
    Opened connection at 12/02/2016 12:26:52 +01:00
    
    SELECT 
        [GroupBy1].[A1] AS [C1]
        FROM ( SELECT 
            COUNT(1) AS [A1]
            FROM [dbo].[fsign_fiche_signaletique] AS [Extent1]
        )  AS [GroupBy1]
    
    
    -- Executing at 12/02/2016 12:26:52 +01:00
    
    -- Completed in 5 ms with result: SqlDataReader
    
    
    
    Closed connection at 12/02/2016 12:26:52 +01:00
    
    The program '[4316] ConsoleApplication1.vshost.exe' has exited with code -1073741510 (0xc000013a).
    
    谢谢

    似乎在每一个新上下文的实例中,结构和 加载表的数据

    FALSE

    1:FALSE,这是您,指示它提取数据

    2:1是错误的,所以听起来可能没有帮助,但这样编码

    3:你的假设是错误的,所以这不需要答案

    对于SO(堆栈溢出)是有帮助的,并且您认为它是如此。。。我建议你把代码。。。因此,我们可以帮助指出其缓慢的原因

    但我已经回答了你们的问题;-)

    更新

    为什么不

    class Program
    {
        static void Main(string[] args)
        {
            Entities context = new Entities();
    
            Stopwatch alarme = new Stopwatch();
            alarme.Start();
    
            var fSignFicheSignaletiqueCount = context.fsign_fiche_signaletique.Count();
    
            alarme.Stop();
            return alarme.ElapsedMilliseconds;
        }
    }
    

    在看到您的编辑后:我需要知道应用程序缓慢的原因,所以我进行了这些连续的测试,所以如果您再次拖放代码,您将看到差异result@LamloumiAfif我不明白你最后的评论。我不知道你的主要方法是什么。。。但对我来说,这只是计算信号表中的记录。