Я работаю над приложением 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 может иметь много жанров.