Каскадное удаление - Древовидная структура - Entity Framework - PullRequest
0 голосов
/ 27 мая 2020

У меня проблема с каскадным удалением. Вот мой проект TreeStructure - мои сущности:

Узел:

public class Node
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int NodeId { get; private set; }
    public string Name { get; set; }
    public int? ParentNodeId { get; set; }
    [ForeignKey("ParentNodeId")]
    public Node ParentNode { get; set; }
    public List<Node> SubNodes { get; set; }
    public List<Leaf> SubLeaves { get; set; }

    public Node()
    {
        SubNodes = new List<Node>();
        SubLeaves = new List<Leaf>();
    }
}

Leaf:

public class Leaf
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int LeafId { get; set; }
    public string Name { get; set; }
    public int? ParentNodeId { get; set; }
    [ForeignKey("ParentNodeId")]
    public Node ParentNode { get; set; }
}

Вот дополнительные соединения:

        modelBuilder.Entity<Node>()
            .HasMany(cat => cat.SubNodes)
            .WithOne(cat => cat.ParentNode);

        modelBuilder.Entity<Node>()
            .HasMany(cat => cat.SubLeaves)
            .WithOne(cat => cat.ParentNode);

Проблема возникает, когда я пытаюсь удалить узел, у которого есть подузлы. В ответ я получаю:

Оператор DELETE находится в конфликте с ограничением SAME TABLE REFERENCE «FK_Nodes_Nodes_ParentNodeId». Конфликт произошел в базе данных «TreeV3», ​​таблица «dbo.Nodes», столбец «ParentNodeId».

Поэтому я решил добавить поведение OnDelete в свободный API:

        modelBuilder.Entity<Node>()
            .HasMany(cat => cat.SubNodes)
            .WithOne(cat => cat.ParentNode)
            .OnDelete(DeleteBehavior.Cascade);

        modelBuilder.Entity<Node>()
            .HasMany(cat => cat.SubLeaves)
            .WithOne(cat => cat.ParentNode)
            .OnDelete(DeleteBehavior.Cascade);

Но когда я запускаю app. Я получаю исключение:

Microsoft.Data.SqlClient.SqlException : введение ограничения FOREIGN KEY «FK_Nodes_Nodes_ParentNodeId» в таблице «Узлы» может вызвать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, либо измените другие ограничения FOREIGN KEY.
Не удалось создать ограничение или индекс. См. Предыдущие ошибки.

Я думаю, это происходит из-за того, что для ParentNodeId в сущности узла установлено значение «может быть нулевым»

public int? ParentNodeId { get; set; }

Но я не могу решить эту проблему.

1 Ответ

0 голосов
/ 28 мая 2020

Согласно сообщению об ошибке, вам необходимо изменить DeleteBehavior с Cascade на NoAction.

Это показывает, что если вы хотите удалить родительский узел, содержащий дочерние узлы , вы не можете удалить родительский узел. Вы должны вручную удалить все дочерние узлы, чтобы удалить родительский узел.

  modelBuilder.Entity<Node>()
              .HasMany(cat => cat.SubNodes)
              .WithOne(cat => cat.ParentNode)
              .OnDelete(DeleteBehavior.NoAction);

            modelBuilder.Entity<Node>()
                .HasMany(cat => cat.SubLeaves)
                .WithOne(cat => cat.ParentNode)
                .OnDelete(DeleteBehavior.NoAction);

Вы можете обратиться к this .

...