【问题标题】:EF won't load data from many to many relationshipEF不会从多对多关系加载数据
【发布时间】:2021-11-05 05:20:42
【问题描述】:
public class A
{
public string Name { get; set }
public ICollection<B> b { get; set; }
}
public class B
{
public string Name { get; set }
public ICollection<A> a { get; set; }
}
从 .NET 5.0 开始,我们不需要创建连接类,我的数据已成功插入到表 A 和 B 以及连接表(A 和 B 的 PK)中。
但是当我尝试检索如下数据时:
DBConext.A.b.count
我得到0。我仔细检查了我的数据库,发现数据在那里,表A,B和连接表AB,我知道这可能是一个小问题,请帮助我
【问题讨论】:
标签:
c#
asp.net-core
entity-framework-core
many-to-many
ef-core-5.0
【解决方案1】:
您需要使用Include method 指定要包含在查询结果中的相关数据。但是您不能简单地使用DBContext.A.Include(a => a.b).b.count 来获取计数。由于您的两个表包含多对多关系。
如果您想获取特定 A 类的(通过特定 id 或名称...)相关的 B 类计数,您可以使用:
public class TestController : ControllerBase
{
private readonly Dotnetcore5_0Context _context;
public TestController(Dotnetcore5_0Context context)
{
_context = context;
}
[HttpGet]
public void Get()
{
//get the count of B class if A's Name equals to aa
var data = _context.A.Include(a => a.b)
.Where(a=>a.Name=="aa").ToList()
.Select(a => a.b.Count()).ToList();
}
}
如果您想获取所有 A 类的相关 B 类计数,您可以使用:
public class TestController : ControllerBase
{
private readonly Dotnetcore5_0Context _context;
public TestController(Dotnetcore5_0Context context)
{
_context = context;
}
[HttpGet]
public void Get()
{
var data = _context.A.Include(a => a.b).ToList()
.Select(a => a.b.Count()).ToList();
}
}
【解决方案2】:
除了 Rena 的回答,如果你使用惰性代理,你可以简化很多事情。
在 DbContext 中,添加以下内容:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLazyLoadingProxies();
...
}
当您获取一/两个实体的关系时,这可能很有用。如果要加载多个对象的关系,最好使用Include,因为数据将从一个数据库请求加载,而不是数百个。