Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Performance 获取导航属性时,实体框架的性能非常慢_Performance_Entity Framework_Navigation Properties - Fatal编程技术网

Performance 获取导航属性时,实体框架的性能非常慢

Performance 获取导航属性时,实体框架的性能非常慢,performance,entity-framework,navigation-properties,Performance,Entity Framework,Navigation Properties,只有两个最简单的表A和B,其中A包含许多B,如下表所示。然后我创建了20000条B记录并将它们添加到一个A中。现在,如果我重新启动程序并执行下面的if(A.Bs==null)代码行,它将花费120秒 我不认为20000张唱片对英孚来说是件大事,那么有没有人能帮我解决这个性能问题 public class A { [Key] public int EntityId { get; set; } public virtual ICollection<B> Bs {

只有两个最简单的表A和B,其中A包含许多B,如下表所示。然后我创建了20000条B记录并将它们添加到一个A中。现在,如果我重新启动程序并执行下面的if(A.Bs==null)代码行,它将花费120秒

我不认为20000张唱片对英孚来说是件大事,那么有没有人能帮我解决这个性能问题

public class A
{
    [Key]
    public int EntityId { get; set; }
    public virtual ICollection<B> Bs { get; set; }
}

public class B
{
    [Key]
    public int EntityId { get; set; }
    public virtual A A { get; set; }
}

在您的代码中,当您访问a.Bs时,所有的集合都被具体化(通过延迟加载程序),而20000条记录的具体化需要很多时间。另外,我认为a.Bs从来都不是空的。
如果您不需要在内存中加载Bs,您可以找到另一种方法进行检查,即

if (a.Bs.Count() == 0) {}

可能是因为您没有任何索引,调用
a.Bs
告诉EF获取与a相关的每个B。谢谢,但实际上,EF将自动在表B中创建IX_a_EntityId。因此,这似乎不是原因。我查看了SQL Profiler。只执行了一个sql,这只需要几毫秒。最大的代价是创建proxyClass。当我在代码行下面写入时:db.Configuration.ProxyCreationEnabled=false;它将立即返回,但a.Bs为空。那么,有人能帮我吗?你能试着使用
if(!a.Bs.Any())
-快一点吗?谢谢,但是如果数据库中没有B,那么a.Bs将为空。而且if(a.Bs.Count()==0){}也将花费与a.Bs.Any()或a.Bs.FirstOrDefault()相同的时间,因为我们尝试获取a.Bs。
using (var db = new MyDbContext())
{
    var a = db.As.First();

    if (a.Bs == null)\\This line will cost about 120 seconds!!!!!!
    {}
}
if (a.Bs.Count() == 0) {}