Entity Framework Core 5:配置多对多关系,如何指定外键名称

pao*_*olo 2 c# database entity-framework-core .net-5

我有一个现有的 SQL Server 数据库,其中通过连接表实现了多对多关系Books<-> :AuthorsPublications

CREATE TABLE [dbo].[Books]
(
    [BookId] INT IDENTITY,
    [Title] NVARCHAR(160) NOT NULL,
    ...
)

CREATE TABLE [dbo].[Authors]
(
    [AuthorId] INT IDENTITY,
    ...
)

CREATE TABLE [dbo].[Publications]
(
    [BookId] INT NOT NULL,
    [AuthorId] INT NOT NULL,

    CONSTRAINT [PK_Publication] PRIMARY KEY ([BookId], [AuthorId])
)
Run Code Online (Sandbox Code Playgroud)

我需要在 Entity Framework Core 5 中配置多对多关系。

对于 EF 6,这相当简单:

protected override void OnModelCreating(DbModelBuilder mb)
{
    mb.Entity<Author>() // an Author
         .HasMany(a => a.Books) // has many Books
         .WithMany(b => b.Authors) // with many Authors
         .Map(mc =>
               {
                    mc.ToTable("Publications"); // Join table: Publications
                    mc.MapLeftKey("AuthorId"); // FK Author: AuthorId
                    mc.MapRightKey("BookId"); // FK Book : BookId
               });
}
Run Code Online (Sandbox Code Playgroud)

但我在使用 Entity Framework Core 5 时遇到问题:

protected override void OnModelCreating(ModelBuilder mb)
{
    mb.Entity<Author>() // an Author
          .HasMany(a => a.Books) // has many Books
          .WithMany(b => b.Authors) // with many Authors
          .UsingEntity(j => j.ToTable("Publications")); // join table: Publications
          // how to define foreign key columns?
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何映射外键列。EF Core 5 使用模式AuthorsAuthorIdBooksBookId

如何更改此命名约定?

谢谢

Rax*_*Rax 5

如果多对多表在 C# 代码中不相关,您可以尝试此操作:

public class Author
{
   public int AuthorId { get; set; }
   public ICollection<Book> Books { get; set; }
}
public class Book
{
   public int BookId { get; set; }
   public ICollection<Author> Authors { get; set; }
}
public class Db : DbContext
{
   protected override void OnModelCreating(ModelBuilder mb)
   {
      mb.Entity<Author>() // an Author
      .HasMany(a => a.Books) // has many Books
      .WithMany(b => b.Authors) // with many Authors
      .UsingEntity<Dictionary<string, object>>("Publications",
        x => x.HasOne<Book>().WithMany().HasForeignKey(nameof(Book.BookId)),
        y => y.HasOne<Author>().WithMany().HasForeignKey(nameof(Author.AuthorId)),
        z => z.ToTable("Publications"));
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 大卫,是的,谢谢你,x 和 y 的命名是正确的,应该重命名。虽然说“期望人们神奇地弄清楚他们到底是什么”,更好的措辞是“请重命名,这样意图就清楚了”,但你肯定会同意居高临下没有什么好处。我们来这里是为了互相帮助:-) 谢谢 (2认同)