使用流利的 api EF Core 5 的多对多关系

Posted

技术标签:

【中文标题】使用流利的 api EF Core 5 的多对多关系【英文标题】:Many to Many relation using fluent api EF Core 5 【发布时间】:2021-03-12 17:21:30 【问题描述】:

我想我有两个具有多对多关系的实体,我将使用 fluent api 来解决这种关系

public class Author

    public int AuthorId  get; set; 
    public string Name  get; set; 
    public ICollection<Book> Books  get; set; 


public class Book

    public int BookId  get; set; 
    public string Title  get; set; 
    public ICollection<Author> Authors  get; set; 


protected override void OnModelCreating(ModelBuilder modelBuilder)
  
   //Book
    modelBuilder.Entity<Book>().HasKey(x => x.BookId);
    modelBuilder.Entity<Book>().Property(x => x.Title).IsRequired();

    //Author
    modelBuilder.Entity<Author>().HasKey(x => x.AuthorId);
    modelBuilder.Entity<Author>().Property(x => x.Name).IsRequired();

    //many to many relationship
    modelBuilder.Entity<Book>()
                .HasMany(x => x.Authors)
                .WithMany(x => x.Books);

使用 ef core 5 我们不需要创建新实体。 问题出在我的数据库中,现在我有一个名称为的表

作者书

两列

AuthorsAuthorId 和 BooksBookId。

如何更改新表的名称和两列的名称? 也是解决这种关系的正确方法吗?

modelBuilder.Entity<Book>()
                    .HasMany(x => x.Authors)
                    .WithMany(x => x.Books);

【问题讨论】:

我认为 shadow 属性可以在这里工作。 【参考方案1】:

使用UsingEntity 可以通过以下方式更改多对多表名和外键列:

protected override void OnModelCreating(ModelBuilder modelBuilder)
  
   //Book
    modelBuilder.Entity<Book>().HasKey(x => x.BookId);
    modelBuilder.Entity<Book>().Property(x => x.Title).IsRequired();

    //Author
    modelBuilder.Entity<Author>().HasKey(x => x.AuthorId);
    modelBuilder.Entity<Author>().Property(x => x.Name).IsRequired();

     modelBuilder.Entity<Book>().HasMany(
            x => x.Authors).WithMany(x => x.Books).
            UsingEntity<Dictionary<string, object>>(
                "M2MTable",
                b => b.HasOne<Author>().WithMany().HasForeignKey("AuthorId"),
                b => b.HasOne<Book>().WithMany().HasForeignKey("BookId"));

结果:

在Entity Framework Community Standup - August 19th 2020 - Many-to-Many in EF Core 5.0上进行了描述

【讨论】:

【参考方案2】:

更改列名:

   ...
   b => b.HasOne<Author>().WithMany().HasForeignKey("AuthorId "),
   b => b.HasOne<Book>().WithMany().HasForeignKey("BookId"));
   ...

见Entity Framework Core Many to Many change navigation property names

【讨论】:

以上是关于使用流利的 api EF Core 5 的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 5.0 中的多对多关系是不是可以配置为仅保留一个导航属性(在一侧)?

EF Core中的多对多映射如何实现?

定义引用同一个表的多对多关系(EF7/core)

如何过滤 EF Core 中的多对多联接

如何直接填充由 EF Core 生成的多对多关系连接表?

EF Core 5.0 添加多对多使得一对多无法确定