EF Core创建多角色多对多关系时Add-Migration报错,如何解决?
解决EF Core多对多关系中“无法确定导航属性代表的关系”错误
你遇到的错误是因为EF Core无法自动推断多组同类型导航属性之间的对应关系。你定义了三组多对多关联(作者-书籍、审稿人-书籍、译者-书籍),但EF不知道Book.Authors该和Person的哪个导航属性配对,同理其他两组也是,所以必须显式指定关系映射。
解决方案1:使用数据注解([InverseProperty])
在导航属性上标注[InverseProperty],明确指定对应的反向导航属性:
修改Book类:
public class Book { [Key] public int ID { get; set; } [Required] public string Title { get; set; } public string? Subtitle { get; set; } [InverseProperty(nameof(Person.BooksAuthored))] public ICollection<Person> Authors { get; set; } [InverseProperty(nameof(Person.BooksReviewed))] public ICollection<Person> Reviewers { get; set; } [InverseProperty(nameof(Person.BooksTranslated))] public ICollection<Person> Translators { get; set; } }
或者修改Person类(二选一即可):
public class Person { [Key] public int ID { get; set; } [Required] public string Name { get; set; } [InverseProperty(nameof(Book.Authors))] public ICollection<Book> BooksAuthored { get; set; } [InverseProperty(nameof(Book.Reviewers))] public ICollection<Book> BooksReviewed { get; set; } [InverseProperty(nameof(Book.Translators))] public ICollection<Book> BooksTranslated { get; set; } }
解决方案2:使用Fluent API(推荐)
在DbContext的OnModelCreating方法中显式配置每组多对多关系,还能自定义中间表名称:
public class YourDbContext : DbContext { public DbSet<Book> Books { get; set; } public DbSet<Person> Persons { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 作者-书籍关联 modelBuilder.Entity<Book>() .HasMany(b => b.Authors) .WithMany(p => p.BooksAuthored) .UsingEntity(j => j.ToTable("BookAuthors")); // 审稿人-书籍关联 modelBuilder.Entity<Book>() .HasMany(b => b.Reviewers) .WithMany(p => p.BooksReviewed) .UsingEntity(j => j.ToTable("BookReviewers")); // 译者-书籍关联 modelBuilder.Entity<Book>() .HasMany(b => b.Translators) .WithMany(p => p.BooksTranslated) .UsingEntity(j => j.ToTable("BookTranslators")); } }
后续操作
完成配置后,重新执行Add-Migration命令生成迁移文件,再运行Update-Database同步到数据库即可。
内容的提问来源于stack exchange,提问作者noobie
相关产品推荐
相关产品推荐

