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



只有两个最简单的表A和B,其中A包含许多B,如下表所示。然后我创建了20000条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!!!!!!
    {}
}

在您的代码中,当您访问.B时,所有集合都会物化(通过惰性加载程序),20.000条记录的物化需要花费大量时间。此外,我认为a.Bs从来都不是空的
如果你不需要在内存中加载Bs,你可以找到另一种方法进行检查,即

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

最新更新