我是否可以避免实体框架6中复杂类型的性能问题

时间:2014-07-20 20:25:35

标签: c# entity-framework entity-framework-6.1

我有一个复杂的类型

[ComplexType]
public class mm 
{ 
    public Guid g { get; set; }
}

和继承层次结构

public abstract class base1
{
    public Guid id { get; set; }
    public String name { get; set; }
    public mm mm1 { get; set; }
}

和各种派生类:

public class derived1 : base1
{
    public mm derived1mm1 { get; set; }
}

派生类中包含多个mm个实例,因此,对于大约10个派生类的层次结构,总共有大约100个mm个字段。 生成的数据库模式是正确的,看起来大致如下: table base1 列id(guid) 列名(字符串) 栏mm1_g(guid) column derived1mm1_g(guid) column derived1mm2_g(guid) column derived2mm1_g(guid) ......

启动时,EF中的第一个查询(预热的那个)需要几十秒。

如果我将mm复杂类型替换为与其对应的单个字段,那么结果类如下所示:     公共抽象类base1     {         public Guid id {get;组; }         public String name {get;组; }         public guid mm1 {get;组; }     }

和各种派生类:

public class derived1 : base1
{
    public guid derived1mm1 { get; set; }
}

,启动时间不到一秒钟。唯一的区别是我已经弄平了复杂类型,如果复杂类型有多个字段和它自己的行为,这不是一个好的答案。

为了清楚起见,这种性能影响仅在第一次查询时发生,即使数据库中绝对没有数据也会发生。

mm是一个复杂的类型,它本身不是一个实体,并且没有为它创建表,所以没有涉及的连接或任何东西。

这听起来像EF6的模型生成实现中的某种错误,其中涉及大量复杂类型字段。

有没有人有一个解决方法可以让我保留复杂的类型。这是一个已知的错误吗?

1 个答案:

答案 0 :(得分:1)

我最近在电子商务应用程序上完成了一些实体性能改进。

我们学到的东西,可能会对你有所帮助

  • 在执行调用之前尽可能晚地使用.Include(mm => mm.derivedmm)(例如.ToList())
  • 问问自己,您是否需要一次性获取所有数据。如果您不需要数据,最好只加载id列表。 (延迟加载)
  • 运行SQL事件探查器并查看SQL实体正在执行。有时,简单地重新排序Linq查询可以真正优化它生成的脚本。
  • 加载后将数据放入ASP.NET缓存中。我们将HEAPS数据放在内存缓存中,性能提升令人难以置信。您的数据库是瓶颈,从内存访问数据的速度提高了1000倍。