【问题标题】: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,我知道这可能是一个小问题,请帮助我

【问题讨论】:

  • 您好@Lin Cui,我的回答是否帮助您解决了您的问题?如果是这样,你能接受作为答案吗?如果没有,你能跟进让我知道吗?参考:How to accept as answer。谢谢。

标签: c# asp.net-core entity-framework-core many-to-many ef-core-5.0


【解决方案1】:

您需要使用Include method 指定要包含在查询结果中的相关数据。但是您不能简单地使用DBContext.A.Include(a =&gt; 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,因为数据将从一个数据库请求加载,而不是数百个。

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 2013-04-05
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多