EF Core Include()ThenInlude() add only one entry to each co



构建从现有数据库公开数据的ASP.NET核心API。所有必需的实体都基于少数表中的数据,因此为每个实体创建了一个视图。API输出-带有实体hirerachy的JSON,使用DbSets之间的include创建。

存在父实体项目,包括子组件、包括用户等等,但它们不属于问题的一部分。简化DTO:

public class RrojectDTO
{
public int projectId { get; set; }
public string componentCode { get; set; }
public virtual ICollection<ComponentDTO> componentsArray { get; set; }
}

public class ComponentDTO
{
public Guid componentId { get; set; }
public virtual RrojectDTO Project { get; set; }
public string componentCode { get; set; }
public virtual ICollection<UserDTO> usersArray { get; set; }
...
}
public class UserDTO
{
public int userId { get; set; }
public virtual ComponentDTO Component { get; set; }
public Guid componentId { get; set; }
...
}

以下是DBContext类的样子:

public MyDbContext(DbContextOptions options)
: base(options)
{
ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTrackingWithIdentityResolution;            
}
public virtual DbSet<ProjectDTO> Projects{ get; set; }
public virtual DbSet<ComponentDTO> Components { get; set; }
public virtual DbSet<UserDTO> Users { get; set; }
....

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ProjectDTO>(entity =>
{
entity.HasKey(f => f.componentCode);
entity.ToView("ProjectsArrayView", "LAB");
entity.HasMany(p => p.componentsArray).WithOne(t => t.Project)
.HasForeignKey(t => t.componentCode);
});
modelBuilder.Entity<ComponentDTO>(entity =>
{
entity.HasKey(f => f.componentId);
entity.ToView("ComponentArrayView", "LAB");
entity.HasMany(p => p.usersArray).WithOne(t => t.Component)
.HasForeignKey(t => t.componentId);
....
});
modelBuilder.Entity<UserDTO>(entity =>
{
entity.HasKey(f => f.userId);
entity.ToView("UsersArrayView", "LAB");
...
});

我用下一个代码连接这个实体:

`var projects = context.Projects.Where(p => p.projectId == Guid.Parse("9C373F8F-CAB8-4914-83D9-4864B2E3E7B3")).Include(co => co.componentsArray).ThenInclude(j => j.usersArray).ToList();`

最初有更多的包括项目,但其他似乎工作得很好。虽然示例中的一个没有按预期工作,例如:有一个项目,有3个组件,相同的2个用户(User1和User2(正在处理每个组件。如果您通过键参数查询每个dbSet,您应该能够看到相应的数据项目输出:1个项目->具有3个组分->每个组件只包含一个用户,而不是两个

我的问题是:为什么。TheInCount((只为每个组件添加User1,而忽略User2?我在这里错过了什么

如果我只查询组件DbSet和Include(x=>x.usersArray(,结果仍然相同,每个组件User1。此外,如果我添加User3、User4,那么填充的仍然是User1。

当我通过SQL探查器找到查询时,它确实包含两个用户(由于策略原因,无法共享查询(。我写了大约20篇文章,但我认为我在这里遗漏了一些基本的东西,请让我知道我是否可以添加一些东西来让这个问题变得更好。

它是一个关系数据库。每个深层记录都应该有以前所有级别的键。我看不出你的用户是如何与组件相关的。如果每个用户只能在一个组件上工作,则将UserDto componentId外键添加到类中,或者创建包含userId和componentId的UserComponent表以保持多对多关系。

public class UserDTO
{
public int userId { get; set; }
public int componentId {get;set;}
public virtual ComponentDTO Component { get; set; }
public Guid projectId  { get; set; }
...
}

相关内容

最新更新