给定以下实体:
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)
公共类用户{公共int Id {获取;放; }公开列表会员资格{get;放; }}
public class Team{public int Id { get;放; }公共列表成员{get;set; }}
公共类成员{public int Id { get;放; }公共字符串角色{ get;设置;}public int UserId { 获取;放; }公共用户用户{ 获取;放; }public int TeamId { 获取;放; }公共团队团队{ get;放; }}
2)Team 类有一个称为 Members 的 Member 集合。
3)Member类包含外键属性UserId和TeamId,分别表示与User和Team的关系。
4) 包含导航属性(用户、团队)以建立 关系。
在 Entity Framework Core 中,您可以使用 Fluent API 定义与连接实体的多对多关系。在您的情况下,您通过 Member 实体在 User 和 Team 实体之间建立多对多关系。
要配置此关系,您可以在 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 的联接表,其中包含两个外键列:UserId 和 TeamId。
如果您想访问 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}");
}
}
这将在单个查询中检索用户实体及其相关的 Member 和 Team 实体。
首先将您的字段转换为属性:
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>();
}