假定有以下实体:

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配置中定义UserMember有许多Team

我知道我可以创建一个派生自Member的属性,但我想知道是否可以在EFCore中定义它.

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

类似于拉威尔(https://laravel.com/docs/10.x/eloquent-relationships#has-many-through)

推荐答案

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

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>();
}

另请查看EF Core: Many-to-many relationships的文档,有不同的选项来设置此 struct ,包括完全限定的关系,这些关系不需要显式流畅的API配置(但在编写查询时可能需要一些逻辑).

Csharp相关问答推荐

使用GeneratedComInterfaceProperty的.NET 8 COM类对于VB 6/SYS或ALEViewer不可见

Blazor:计算值或保留为默认值

System.Data.SQLite:判断SQLite数据库是否为空(任何表中至少有一行)

为什么我不能更改尚未设置的模拟对象属性的值?

HttpContext. RequestAborted当Android APP失go 连接时未取消

无法解析数据库上下文的服务

如何从HttpContext获取请求正文

在静态模式下实例化配置

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

为什么无法将对象转换为泛型类型

为什么C#认为这个非托管 struct 有一个重叠

在两个已具有一对多关系的表之间添加另一个一对多关系

为什么方法的值在SELECT方法中不会更改?

在使用StringBuilder时,如何根据 colored颜色 设置为richTextBox中的特定行着色?

如何在GRPC代码First服务的返回类型上使用多态性?

JsonPath在Newtonsoft.Json';S实现中的赋值

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

在ObservableCollection上使用[NotifyPropertyChangedFor()]源代码生成器不会更新UI

与Visual Studio 2022中的.NET框架相比,如何在.NET Core 6中获取错误输出的窗口句柄

使用';UnityEngineering.Random.Range()';的IF语句仅适用于极高的最大值