EF 不会从多关系加载数据到多关系


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,我知道这可能是一个小问题,有人请帮我

您需要使用Include方法来指定要包含在查询结果中的相关数据。但是您不能简单地使用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();
}
}

除了Rena答案之外,如果使用惰性代理,还可以简化很多事情。

在DbContext中,添加以下内容:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLazyLoadingProxies();
...
} 

当您获取一个/两个实体的关系时,这可能很有用。如果要加载多个对象的关系,最好使用Include,因为数据将从一个DB请求加载,而不是从数百个请求加载。

最新更新