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倍