Как настроить отношение «многие ко многим» в Entity Framework Core - PullRequest
0 голосов
/ 24 января 2019

У меня есть несколько статей и несколько авторов, и я хочу связать их как:

  • любая статья может иметь любое количество авторов, а
  • каждый автор может написать любое количество статейони хотят

Я создал отношения ManyToMany, используя этот учебник: https://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration

Вот как я определил мои классы.

Статья

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; }
}

Автор

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; }
}

ArticleAuthor

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 update database

Все выглядит хорошо, за исключением случаев, когда я пытаюсь добавить статью с автором через эту службу:

Служба

// 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: свойство AuthorId для типа сущности ArticleAuthor имеет временное значение.Либо задайте постоянное значение явно, либо убедитесь, что база данных настроена на создание значений для этого свойства.

1 Ответ

0 голосов
/ 24 января 2019

Попробуйте эту полезную нагрузку, необходимо указать ArticleId и AuthorId, ArticleId неявно присутствует в родительском классе, поэтому вы должны указать хотя бы AuthorId:

{
    "Title":"Title 2",
    "ReadingTime" : 2,
    "Date":"01.12.2019",
    "Theme": "1",
    "ArticleAuthors":[
        {
            "AuthorId":"1"
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...