EFCore и отношения «многие ко многим»C#

Место общения программистов C#
Ответить
Anonymous
 EFCore и отношения «многие ко многим»

Сообщение Anonymous »

У меня есть две сущности:

Код: Выделить всё

public class Book
{
public required Guid Id { get; init; }
public required string Title { get; set; }
public required List Genres { get; init; }
}
и:

Код: Выделить всё

public class Genre
{
public Guid Id { get; init; }
public string Name { get; init; } = string.Empty;
[JsonIgnore]
public List Books { get; init; }
}
Эти объекты настроены как отношения «многие ко многим» в EFCore 9.
Я запускаю свой API и создаю следующую книгу:

Код: Выделить всё

{
"Title": "My first book",
"Genres": [
"Non-fiction book"
]
}
Я добавляю новую книгу в свою базу данных следующим образом:

Код: Выделить всё

{
"Title": "My second book",
"Genres": [
"Horror novels"
]
}
Все работает нормально, и я вижу свои данные в своей базе данных.
Далее я хочу обновить конкретную книгу, отправив ее через API:

Код: Выделить всё

{
"Title": "My first book",
"Genres": [
"Non-fiction book",
"Non-fiction book", ( let's say that by mistake, the same genres get passed twice)
"Horror novels"
]
}
Дело в том, что когда я обновил свою запись «Моя первая книга», я получил дубликаты в своей базе данных для «научно-популярной книги», а затем для «романов ужасов». Как я могу настроить это так, чтобы в таблице жанров все отображалось только один раз, и у меня не было дубликатов в таблице соединений?
Или мне следует оставить все как есть и получать только те данные, которые мне нужны?< /p>
Я пытался получить все доступные жанры, а затем выделить отдельные жанры, но, похоже, у меня ничего не получилось.

Код: Выделить всё

[HttpPost]
public async Task Create([FromBody] CreateBook request)
{
await _bookRepository.CreateAsync(request);

return CreatedAtAction(nameof(Get), new {id = request.Id }, request);
}
В BookRepository у меня есть следующий метод:

Код: Выделить всё

public async Task UpdateAsync(Book book)
{
_context.Books.Update(book);
var result = await _context.SaveChangesAsync();

return result > 0;
}
Дело в том, что когда я создаю первую книгу, все ок. Но когда я запускаю обновление, если по ошибке передаю старые жанры и новые жанры (например, один и тот же жанр дважды в списке), он вставляет один и тот же жанр как дубликат.

Подробнее здесь: https://stackoverflow.com/questions/793 ... lationship
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»