Я разрабатываю простое приложение Notes в ASP. NET ядро + ядро Entity Framework и у меня проблема с обновлением заметок, которые связаны со многими тегами через таблицу соединений (NoteTags).
Все свойства объекта примечания обновляются в базе данных (заголовок, содержимое, сводка ...), за исключением записей в объединяемой таблице NoteTags.
Примечание класс:
public class Note
{
public int Id { get; set; }
public string Title { get; set; }
public DateTime CreationDateTime { get; set; }
public string Content { get; set; }
public string Summary { get; set; }
public List<NoteTag> NoteTags { get; set; } = new List<NoteTag>();
}
Метка класс:
public class Tag
{
public int Id { get; set; }
public string Name { get; set; }
public int NotesCount { get; set; }
public List<NoteTag> NoteTags { get; set; } = new List<NoteTag>();
}
Таблица соединений NoteTag :
public class NoteTag
{
public Note Note { get; set; }
public int NoteId { get; set; }
public Tag Tag { get; set; }
public int TagId { get; set; }
}
Создание / удаление и обновление заметок происходит в классе репозитория, который управляет dbcontext. Процедура обновления хранилища вызывается NotesController, который обрабатывает модель представления с примечанием, которое нужно редактировать.
NotesController => EditNote
public IActionResult EditNote(EditNoteViewModel viewModel)
{
if (ModelState.IsValid)
{
if (viewModel.SelectedTags != null)
{
var tagList = viewModel.SelectedTags.Split(" ");
foreach (string tagName in tagList)
{
if (tagName.Length != 0 && tagName != " ")
{
var tag = this._TagRepository.GetTagByName(tagName);
if (tag == null)
tag = this._TagRepository.CreateTag(new Tag { Name = tagName });
viewModel.NoteToEdit.NoteTags.Add(
new NoteTag { Note = viewModel.NoteToEdit, NoteId = viewModel.NoteToEdit.Id, Tag = tag, TagId = tag.Id }
);
}
}
}
this._NoteRepository.EditNote(viewModel.NoteToEdit.Id, viewModel.NoteToEdit);
Репозиторий Notes => EditNote (..)
public void EditNote(int id,Note newNote)
{
var note = this.GetNote(id);
foreach (var noteTag in newNote.NoteTags.ToList())
{
if (!note.NoteTags.Contains(noteTag))
{
noteTag.Tag.NotesCount += 1;
note.NoteTags.Add(noteTag);
}
}
foreach (var noteTag in note.NoteTags.ToList())
{
if (!newNote.NoteTags.Contains(noteTag))
{
noteTag.Tag.NotesCount -= 1;
note.NoteTags.Remove(noteTag);
}
}
note.Title = newNote.Title;
note.Content = newNote.Content;
note.CreationDateTime = newNote.CreationDateTime;
note.Summary = newNote.Summary;
this._context.Notes.Update(note);
this._context.SaveChanges();
}