Ядро Entity Framework: обновление сущности, являющейся частью отношения многих ко многим - PullRequest
0 голосов
/ 27 марта 2020

Я разрабатываю простое приложение 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();
        }
...