Как добавить запись в таблицу, а также добавить запись в соответствующую связанную таблицу - PullRequest
0 голосов
/ 05 июня 2019

Я работаю над приложением Library, используя Entity Framework с подходом Code first.У меня есть таблица Books, и мне нужно добавить в нее запись, но также, когда я добавляю запись, мне нужно добавить запись в связанных таблицах, поскольку Books относится к таблице Writers и Genres (фактически, поскольку Book может иметь многожанры Книги связаны с таблицей BookGenres).

Вот моя команда для добавления книги в таблицу:

EfAddBookCommand

public class EfAddBookCommand : IAddBookCommand
{
    private readonly LibraryContext _context;

    public EfAddBookCommand(LibraryContext context)
    {
        _context = context;
    }

    public void Execute(BookDto request)
    {
        if (_context.Books.Any(b => b.Title == request.Title))
        {
            throw new Exception();
        }

        if(!(_context.Writers.Any(w => w.Id == request.WriterId)))
        {
            throw new Exception();
        }

        if (!(_context.Genres.Any(g => g.Id == request.GenreId)))
        {
            throw new Exception();
        }

        _context.Books.Add(new Domain.Book
        {
            Title = request.Title,
            Description = request.Title,
            AvailableCount = request.AvailableCount,
            Count = request.Count,
            WriterId = request.WriterId
        });


    }
}}

Теперь я не уверен, чтолучший способ добавить в эти связанные таблицы, когда я добавляю запись в таблицу Books.Проблема в том, что мне нужно знать идентификатор этих записей, например, если я добавляю что-то в Writer, мне нужно знать его идентификатор, чтобы я мог записать этот идентификатор в WriterId EfAddBookCommand

Другие связанные классы: EfAddWriterCommand

    public class EfAddWriterCommand : IAddWriterCommand
{
    private readonly LibraryContext _context;

    public EfAddWriterCommand(LibraryContext context)
    {
        _context = context;
    }

    public void Execute(WriterDto request)
    {
        if(_context.Writers.Any(w => w.Name == request.Name))
        {
            throw new Exception();
        }

        _context.Writers.Add(new Domain.Writer
        {
            Name = request.Name
        });

        _context.SaveChanges();
    }
}

}

Domain.Writer

public class Writer : BaseEntity
{
    public string Name { get; set; }
    public ICollection<Book> Books { get; set; }
}

Domain.Book

public class Book : BaseEntity
{
    public string Title { get; set; }
    public int? WriterId { get; set; }
    public Writer Writer { get; set; }
    public string Description { get; set; }
    public int AvailableCount { get; set; } 
    public int Count { get; set; } 
    public ICollection<BookGenre> BookGenres { get; set; }
    public ICollection<BookReservation> BookReservations { get; set; }
}

WriterDto

   public class WriterDto
{
    public string Name { get; set; }
}

BookDto

    public class BookDto
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Writer { get; set; }
    public int? WriterId { get; set; }
    public int? GenreId { get; set; }
    public string Description { get; set; }
    public int AvailableCount { get; set; } //available for Reservation
    public int Count { get; set; } //all books regardless whether reserved or not
    public IEnumerable<string> BookGenres { get; set; }
    //public IEnumerable<string> BookReservations { get; set; }
}

BooksController

    [Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase
{

    private IAddBookCommand _addCommand;

    public BooksController(IAddBookCommand addCommand)
    {

        _addCommand = addCommand;
    }

    // POST: api/Books
    [HttpPost]
    public IActionResult Post([FromBody] BookDto dto)
    {
        try
        {
            _addCommand.Execute(dto);
            return StatusCode(201);
        }
        catch (Exception)
        {
            return StatusCode(500);
        }
    }

}

Кроме того, я должен быть в состоянии вставить в BookGenres, так как Book может иметь много жанров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...