Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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# 在entity framework 6中,我可以避免复杂类型的性能问题吗_C#_Entity Framework_Entity Framework 6.1 - Fatal编程技术网

C# 在entity framework 6中,我可以避免复杂类型的性能问题吗

C# 在entity framework 6中,我可以避免复杂类型的性能问题吗,c#,entity-framework,entity-framework-6.1,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 derive

我有一个复杂的类型

[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; }
}
public class derived1 : base1
{
    public guid derived1mm1 { get; set; }
}
派生类中有多个
mm
实例,因此在大约10个派生类的层次结构中,总共有大约100个
mm
字段。 生成的数据库架构是正确的,大致如下所示: 表1 列id(guid) 列名(字符串) 列mm1_g(guid) 列派生1MM1_g(guid) 导出的列1mm2_g(guid) 列派生的2mm1_g(guid)

在启动时,EF中的第一个查询(使事情升温的查询)需要数十秒

如果我将mm复杂类型替换为与之对应的单个字段,则生成的类如下所示: 公共抽象类base1 { 公共Guid id{get;set;} 公共字符串名称{get;set;} 公共guid mm1{get;set;} }

以及各种派生类:

public class derived1 : base1
{
    public mm derived1mm1 { get; set; }
}
public class derived1 : base1
{
    public guid derived1mm1 { get; set; }
}
,启动时间小于1秒。唯一的区别是我已经将复杂类型展平,如果复杂类型有多个字段和它自己的行为,这不是一个好的答案

需要明确的是,这种性能下降只发生在第一次查询时,即使数据库中绝对没有数据,也会发生

mm是一个复杂的类型,它本身不是一个实体,并且没有为它创建表,因此不涉及连接或其他任何内容

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


是否有人有一个变通方法可以让我保留复杂类型。这是一个已知的bug吗?

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

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

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

您的数据库是由代码生成的吗?如果是这种情况,请检查两种情况下创建的模式(重继承和无)。我的猜测是,通过这种继承,你会得到大量的联合表,试着检查一下。整个过程都是先编写代码。这些是复杂的类型,而不是其他表,并且不涉及连接。无论如何,这是一个预热问题。即使数据库为空,第一次查询也需要20秒或更长时间。第二个几乎是瞬间的。我怀疑当实体中有很多嵌入的复杂类型时,EF模型验证的某些部分会有不良行为。