首页 > 解决方案 > EF Core - 如何在包含的集合中包含项目的集合

问题描述

我有Request类,它有两个集合(DetailsRequestHistoryRecords)。Details 集合中的 Detail 也有DetailHistoryRecords集合。

我想删除所有引用集合的整个请求(通过检索所有项目并一一删除)。但我有问题一次加载所有集合。

班级

public class Request
{
   public IList<Detail> Details { get; private set; } = new List<Detail>();
   public IList<RequestHistory> RequestHistoryRecords { get; private set; } = new List<RequestHistory>();
}

public class Detail
{
   public IList<DetailHistory> DetailHistoryRecords { get; private set; } = new List<DetailHistory>();
}

数据库上下文定义

// 1-n relationship
 modelBuilder.Entity<Request>()
     .HasMany(x => x.Details)
     .WithOne();

 // 1-n relationship
modelBuilder.Entity<Request>()
     .HasMany(x => x.RequestHistoryRecords)
     .WithOne();

// 1-n relationship
modelBuilder.Entity<Detail>()
      .HasMany(x => x.DetailHistoryRecords)
      .WithOne();

我尝试使用IncludeandThenInclude方法加载所有集合,但我没有看到DetailHistoryRecords集合,我不知道为什么。我是在正确的轨道上还是应该完全以不同的方式加载?

var request = _context.Request
        .Include(x => x.Details) // Works
        .ThenInclude(details => details./*I do not see DetailHistoryRecords here ?! */)
        .Include(x => x.RequestHistoryRecords) // Works
        .Single(x => x.Id == id);

标签: c#nestedentity-framework-coreforeign-keys

解决方案


正如我所见,Details 和 RequestHistoryRecords 并不相互依赖。您可以在查询中删除以下行。

.ThenInclude(details => details./*I do not see DetailHistoryRecords here ?! */)

调用下面的代码

var request = _context.Request
        .Include(x => x.Details) // Works
        .Include(x => x.RequestHistoryRecords) // Works
        .Single(x => x.Id == id);

推荐阅读