实体框架在获取导航属性时性能非常慢

时间:2015-11-15 07:21:09

标签: performance entity-framework navigation-properties

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

我不认为20000记录对EF来说是件大事,那么有没有人可以帮助我解决这个性能问题?

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; }
}

////////////上下文是://///////////////

public class MyDbContext : DbContext
{
    public MyDbContext()
        : base("MyDbContext")
    {
    }

    public DbSet<A> As { get; set; }
    public DbSet<B> Bs { get; set; }
}

///////////性能问题如下//////////////

using (var db = new MyDbContext())
{
    var a = db.As.First();

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

1 个答案:

答案 0 :(得分:0)

在您的代码中,当您访问a.Bs时,所有集合都已实现(通过延迟加载程序)并且20.000记录实现需要花费大量时间。另外,我认为a.Bs永远不会为空 如果您不需要在内存中加载B,您可以找到另一种方法进行检查,即

if (a.Bs.Count() == 0) {}
相关问题