. NET Основная проблема запроса POST с отношением многие-ко-многим в Web API - PullRequest
0 голосов
/ 21 апреля 2020

Я делаю Web API в. NET Core, используя EntityFrameworkCore. Я пытаюсь записать POST-запрос к таблице, который реализует отношение «многие ко многим», это выглядит так:

public class Agency
    {
        public Guid Id { get; set; }
        public string Name { get; set; }

        public IList<Book> Books { get; set; }
    }

public class Author
    {
        public Guid Id { get; set; }
        public string Name { get; set; }

        public IList<Book> Books { get; set; }
    }

public class Book
    {
        public Guid AgencyId { get; set; }
        public Guid AuthorId { get; set; }
        public string Title { get; set; }
        public string Language { get; set; }   
        public int Pages { get; set; }

        public Agency Agency { get; set; }
        public Author Author { get; set; }
    }

public class DataContext : DbContext
    {
        public DataContext(DbContextOptions<DataContext> options) 
            : base(options) { }

        public DbSet<Book> Books { get; set; }
        public DbSet<Agency> Agencies { get; set; }
        public DbSet<Author> Authors { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Book>().HasKey(b => new { b.AgencyId, b.AuthorId});

            modelBuilder.Entity<Book>()
                .HasOne<Agency>(b => b.Agency)
                .WithMany(a => a.Books)
                .HasForeignKey(b => b.AgencyId);

            modelBuilder.Entity<Book>()
                .HasOne<Author>(b => b.Author)
                .WithMany(a => a.Books)
                .HasForeignKey(b => b.AuthorId);
        }
    }

Я написал репозиторий и оболочку для него, он работает нормально, но я возникли проблемы с объектом POST for Book:

public IActionResult Post(Book model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest("Invalid data.");
            }

            var book = new Book();
            book.Title = model.Title;
            book.Language = model.Language;
            book.Pages = model.Pages;
            book.Author = _repoWrapper.Author.FindByCondition(a => a.Id == model.AuthorId).FirstOrDefault();
            book.Agency = _repoWrapper.Agency.FindByCondition(a => a.Id == model.AgencyId).FirstOrDefault();

            _repoWrapper.Book.Create(book);
            _repoWrapper.Save();
            return Ok();
        }

Когда я делаю этот запрос, я получаю исключение дублирования данных. Что мне нужно изменить, чтобы все заработало?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Если исключение возникает во время метода сохранения, убедитесь, что AgencyId и AuthorId ваших вновь добавленных данных Книги не будут дублироваться с предыдущими данными одновременно.

Поскольку вы установите the primary key of the combination of AgencyId and AuthorId для таблицы Книги в OnModelCreating.

0 голосов
/ 22 апреля 2020

Я думаю, это потому, что вы назначаете объект свойству навигации;

book.Author = _repoWrapper.Author.FindByCondition(a => a.Id == model.AuthorId).FirstOrDefault();
book.Agency = _repoWrapper.Agency.FindByCondition(a => a.Id == model.AgencyId).FirstOrDefault();

Поскольку вы явно определили AuthorId и AgencyId, вы можете назначить их вместо этого. EntityFramework поймет, если вы назначите идентификаторы вместо объекта, попробуйте это;

public IActionResult Post(Book model)
{
   if (!ModelState.IsValid)
   {
      return BadRequest("Invalid data.");
   }

   var book = new Book();
   book.Title = model.Title;
   book.Language = model.Language;
   book.Pages = model.Pages;
   book.AuthorId = model.AuthorId;
   book.AgencyId = model.AgencyId;

   _repoWrapper.Book.Create(book);
   _repoWrapper.Save();
   return Ok();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...