ASP. NET MVC - каскадное удаление одной таблицы - PullRequest
0 голосов
/ 02 марта 2020

У меня есть приложение, отображающее дерево каталогов. Похоже, у меня отображаются каталоги. Пользователь выбирает каталог, нажимает кнопку удаления, и каталог и подкаталоги должны быть удалены.

Вот мой класс Node:

    public class Node
    {
        public int Id { get; set; }
        public String Name { get; set; }

        public Node Parent { get; set; }
        public int? ParentId { get; set; }
    }

Вот моя кнопка

<button type="button" style="display:none;" id="delete_node" class="btn btn-danger" data-base-url="@Url.Action("Delete","Home")">
            Delete node
        </button>

Jquery метод, который запускает действие удаления:

        $('#delete_node').on('click', function (e) {


            var urlToDelete = $(this).data('base-url') + '/' + SelectedId;

            $.post(urlToDelete, function () {
                location.reload();
            });
        });

и действие удаления:

        [HttpPost]
        public HttpStatusCodeResult Delete(int id)
        {
            Node nodeInDb = _context.NodeEntities.Single(n => n.Id == id);

            _context.NodeEntities.Remove(nodeInDb);
            _context.SaveChanges();

            return new HttpStatusCodeResult(System.Net.HttpStatusCode.OK);

        }

Все хорошо, но когда каталог, который я хочу удалить, пуст. Когда в каталоге есть подкаталоги, и я нажимаю кнопку «Удалить», появляется ошибка

SqlException: инструкция DELETE конфликтует с ограничением SAME TABLE REFERENCE «FK_dbo.Nodes_dbo.Nodes_Parent_Id». Конфликт произошел в базе данных «TreeDB», таблице «dbo.Nodes», столбце «ParentId». Оператор завершен.

Кажется, что каталоги не удаляются каскадным способом. Как включить эту опцию?

Образцы записей в базе данных <----------------- </p>

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Я только что создал метод удаления каталога и подкаталогов, но я думаю, что это лучший способ сделать это.

        private void Remove(Node node)
        {

            var listOfNodes = _context.NodeEntities.Where(a => a.ParentId == node.Id);
            if (listOfNodes != null)
                foreach (var node3 in listOfNodes)
                    Remove(node3);

            _context.NodeEntities.Remove(node);
        }
0 голосов
/ 02 марта 2020

Я думаю, что Entity создала внешний ключ с public Node Parent { get; set; }.

...