如何在Entity Framework Core中配置多对多关系

4
我有一些文章和作者,想要将它们链接如下:
  • 任何文章都可以有任意数量的作者,
  • 每个作者可以写任意数量的文章。
我使用这篇教程创建了一个多对多关系:https://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration 以下是我定义类的方式。 文章(Article)
public class Article
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public string Title { get; set; }

    public DateTime Date { get; set; }

    public ICollection<ArticleAuthor> ArticleAuthors { get; set; }
}

Author

public class Author
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    [Column(TypeName = "text")] public string Name { get; set; }

    [Column(TypeName = "text")] public string Email { get; set; }

    public ICollection<ArticleAuthor> ArticleAuthors { get; set; }
}

文章作者
public class ArticleAuthor
{
    public int ArticleId { get; set; }

    public Article Article { get; set; }

    public int AuthorId { get; set; }

    public Author Author { get; set; }
}

DbContext(数据库上下文)
public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {
    }

    public DbSet<Article> Articles { get; set; }

    public DbSet<Author> Authors { get; set; }

    public DbSet<ArticleAuthor> ArticleAuthors { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ArticleAuthor>()
            .HasKey(bc => new {bc.ArticleId, bc.AuthorId});
        modelBuilder.Entity<ArticleAuthor>()
            .HasOne(bc => bc.Article)
            .WithMany(b => b.ArticleAuthors)
            .HasForeignKey(bc => bc.ArticleId);
        modelBuilder.Entity<ArticleAuthor>()
            .HasOne(bc => bc.Author)
            .WithMany(c => c.ArticleAuthors)
            .HasForeignKey(bc => bc.AuthorId);
    }
}

在我运行了 dotnet ef database update 后,表格已经按预期创建。
一切看起来都很好,但当我尝试通过此服务添加一个带有作者的文章时,出现了问题: 服务
// POST: api/Articles
[HttpPost]
public async Task<IActionResult> PostArticle([FromBody] Article article)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    _context.Articles.Add(article);
    await _context.SaveChangesAsync();

    return Ok(article);
}

JSON

{
    "Title":"Title 2",
    "ReadingTime" : 2,
    "Date":"01.12.2019",
    "Theme": "1",
    "ArticleAuthors":[
        {
            "ID":"1"
        }
    ]
}

当我尝试添加一篇带有作者的文章时,我一直卡在这个错误上:
System.InvalidOperationException:实体类型“ArticleAuthor”上的属性“AuthorId”具有临时值。请明确设置永久值,或确保数据库配置为为此属性生成值。

1
EF配置没问题。但JSON中的“ArticleAuthors”成员有问题。看起来它发送了一个Author列表,而不是一个ArticleAuthor列表(“ID”?) - Ivan Stoev
@IvanStoev,感谢您的评论。是的,我只发送了作者ID,而不是ArticleAuthor。这是我在使用其他ORM(如Doctrine、Hibernate)时的做法。让我试试。 - Kr1
1个回答

1

请尝试使用此有效负载,其中ArticleId和AuthorId应为必填项。由于ArticleId是隐式的父类中,因此您至少应提供AuthorId:

{
    "Title":"Title 2",
    "ReadingTime" : 2,
    "Date":"01.12.2019",
    "Theme": "1",
    "ArticleAuthors":[
        {
            "AuthorId":"1"
        }
    ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接