C# 如何直接填充EF Core为多对多关系生成的联接表?

C# 如何直接填充EF Core为多对多关系生成的联接表?,c#,entity-framework-core,many-to-many,ef-core-5.0,C#,Entity Framework Core,Many To Many,Ef Core 5.0,我有以下实体: public class Book { public int Id { get; set; } public string Title { get; set; } public List<Genre> Genres { get; set; } } public class Genre { public int Id { get; set; } public string Name { get; set; } public List<Bo

我有以下实体:

public class Book
{
  public int Id { get; set; }
  public string Title { get; set; }
  public List<Genre> Genres { get; set; }
}

public class Genre
{
  public int Id { get; set; }
  public string Name { get; set; }
  public List<Book> Books { get; set; }
}
公共课堂教材
{
公共int Id{get;set;}
公共字符串标题{get;set;}
公共列表类型{get;set;}
}
公共课体裁
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表书籍{get;set;}
}
EF Core 5可以处理创建联接表的问题,但是我如何使用这个表,我应该怎么做?例如,我正在发送响应,向现有图书添加两种现有类型(我有图书和类型ID)。我想最好是直接用这个ID填充联接表,而不是首先从上下文中获取这些实体,然后将类型实体添加到Book entity的“类型”字段。

如果您查看和,您可以看到您可以访问导航,但文档中指出,这可能会在以后更改<代码>不依赖于字典中的联接类型,除非已明确配置该联接类型

所以我会手工创建一个
连接表
,其实并不难:

公共课堂教材
{
公共int Id{get;set;}
公共字符串标题{get;set;}
公共列表图书类型{get;set;}
}
公共课体裁
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表图书类型{get;set;}
}
公共类图书体裁
{
public int GenreId{get;set;}
public int BookId{get;set;}
公共类型{get;set;}
公共图书{get;set;}
}
如果您觉得有能力,您可以添加
Fluent api
配置,以便尽可能少地依赖EF。在上下文中或在单独的
配置中的
OnModelCreatingMethod
中添加(可选):

builder.Entity()
.ToTable(“书籍类型”)
.HasKey(=>new{uu.BookId,u.GenreId});
builder.Entity()
.Property(=>\u0.BookId)
.ValueGeneratedNever();
builder.Entity()
.Property(=>\u0.GenreId)
.ValueGeneratedNever();
builder.Entity()
.HasOne(=>.Book)
.WithMany(=>u0.Book体裁)
.HasForeignKey(=>.BookId);
builder.Entity()
.HasOne(=>quo.Genre)
.WithMany(=>u0.Book体裁)
.HasForeignKey(=>uu.GenreId);
您还需要将JoinTable添加到上下文中:

public DbSet BookGenreRelations{get;set;}
现在,您可以添加新关系:

this.myContext.BookGenreRelations.Add(新的BookGenre){
BookId=myBookId,
GenreId=myGenreId,
});
this.myContext.SaveChanges();
注意:在上述示例中,您也可以使用
async
版本