gpt4 book ai didi

c# - Fluent API,Entity Framework Core 中的多对多

转载 作者:IT王子 更新时间:2023-10-29 04:14:23 25 4
gpt4 key购买 nike

我在 stackoverflow 上搜索了使用 EF Core、Code first 和 Fluent API 生成多对多关系的合适解决方案。

一个简单的场景是:

public class Person
{
public Person() {
Clubs = new HashSet<Club>();
}
public int PersonId { get; set; }
public virtual ICollection<Club> Clubs { get; set; }
}

public class Club
{
public Club() {
Persons = new HashSet<Person>();
}
public int ClubId { get; set; }
public virtual ICollection<Person> Persons { get; set; }
}

如果我错了,请纠正我,但老实说,我找不到包含有关如何使用所描述的工具执行此操作的详细解释的问题。任何人都可以解释这是如何完成的吗?

最佳答案

EF 核心 5.0 RC1+

从 EF Core 5.0 RC1 开始,可以在没有显式连接表的情况下执行此操作。 EF Core 能够为您的问题中显示的多对多关系配置映射,而无需您创建 PersonClub 类型。

参见 What's New in EF Core 5.0, RC1, Many-to-many在官方文档中获取更多信息。

以前的版本

如果不使用显式连接类,这在 EF Core 中是不可能的。参见 here有关如何执行此操作的示例。

有一个开放的issue在 Github 上要求能够在不需要显式类的情况下执行此操作,但尚未完成。

使用您的场景,我链接的示例将推荐以下实体类:

public class Person
{
public int PersonId { get; set; }
public virtual ICollection<PersonClub> PersonClubs { get; set; }
}

public class Club
{
public int ClubId { get; set; }
public virtual ICollection<PersonClub> PersonClubs { get; set; }
}

public class PersonClub
{
public int PersonId { get; set; }
public Person Person { get; set; }
public int ClubId { get; set; }
public Club Club { get; set; }
}

然后将使用以下 OnModelCreating 进行设置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PersonClub>()
.HasKey(pc => new { pc.PersonId, pc.ClubId });

modelBuilder.Entity<PersonClub>()
.HasOne(pc => pc.Person)
.WithMany(p => p.PersonClubs)
.HasForeignKey(pc => pc.PersonId);

modelBuilder.Entity<PersonClub>()
.HasOne(pc => pc.Club)
.WithMany(c => c.PersonClubs)
.HasForeignKey(pc => pc.ClubId);
}

如果您觉得有必要,请务必转到我链接的未解决问题并表达您的不满。

编辑: Unresolved 问题建议使用简单的 Select 来浏览这个有点麻烦的层次结构。为了从 PersonIdClub 的集合,您可以使用 SelectMany .例如:

var clubs = dbContext.People
.Where(p => p.PersonId == id)
.SelectMany(p => p.PersonClubs);
.Select(pc => pc.Club);

我不能保证这是否真的是一个“最佳实践”,但它肯定可以达到目的,我认为可以公平地说它并不过分丑陋。

关于c# - Fluent API,Entity Framework Core 中的多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46184678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com