使用流利的 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 的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章