如何在 EFCore 中定义 Has Many Through

问题描述 投票:0回答:3

给定以下实体:

public class User
{
    public int Id;
    public List<Team> Teams { get; set; } // how to setup this in EFCore?
}

public class Team
{
    public int Id;
    public List<Member> Members { get; set; }
}

// Pivot
public class Member
{
    public int Id;
    public string Role;

    public User User { get; set; }
    public Team Team { get; set; }
}

如何在 EFCore 配置中定义

User
通过
Team
有很多
Member

我知道我可以创建一个派生自

Member
的属性,但想知道是否可以在 EFCore 中定义它。

public class User
{
    public int Id;
    public List<Member> Members { get; set; }
    public List<Team> Teams => Members.Select(m => m.Team).ToList();
}

类似于 Laravel 的东西 (https://laravel.com/docs/10.x/eloquent-relationships#has-many-through)

c# .net-core entity-framework-core
3个回答
0
投票

公共类用户{公共int Id {获取;放; }公开列表会员资格{get;放; }}

public class Team{public int Id { get;放; }公共列表成员{get;set; }}

公共类成员{public int Id { get;放; }公共字符串角色{ get;设置;}public int UserId { 获取;放; }公共用户用户{ 获取;放; }public int TeamId { 获取;放; }公共团队团队{ get;放; }}

  1. User 类现在有一个名为 Memberships 的 Member 集合。

2)Team 类有一个称为 Members 的 Member 集合。

3)Member类包含外键属性UserId和TeamId,分别表示与User和Team的关系。

4) 包含导航属性(用户、团队)以建立 关系。


0
投票

在 Entity Framework Core 中,您可以使用 Fluent API 定义与连接实体的多对多关系。在您的情况下,您通过 Member 实体在 UserTeam 实体之间建立多对多关系。

要配置此关系,您可以在 DbContext 类中使用以下代码片段:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .HasMany(u => u.Members)
        .WithOne(m => m.User)
        .HasForeignKey(m => m.UserId);

    modelBuilder.Entity<Team>()
        .HasMany(t => t.Members)
        .WithOne(m => m.Team)
        .HasForeignKey(m => m.TeamId);
}

这将创建一个名为 UserTeamMembers 的联接表,其中包含两个外键列:UserIdTeamId

如果您想访问 User 实体的 Teams 属性,而不需要手动定义该属性,可以在查询数据时使用 Include 方法来提前加载相关实体:

var users = _context.Users
    .Include(u => u.Members)
    .ThenInclude(m => m.Team)
    .ToList();

foreach (var user in users)
{
    foreach (var team in user.Members.Select(m => m.Team))
    {
        Console.WriteLine($"User {user.Id} is in team {team.Id}");
    }
}

这将在单个查询中检索用户实体及其相关的 MemberTeam 实体。


0
投票

首先将您的字段转换为属性:

public class User
{
    public int Id { get; set; }
}

public class Team
{
    public int Id { get; set; }
}

public class Member
{
    public int Id { get; set; }
}

然后您可以在

OnModelCreating
中使用Fluent API进行设置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .HasMany(u => u.Teams)
        .WithMany()
        .UsingEntity<Member>();
}
© www.soinside.com 2019 - 2024. All rights reserved.