У меня проблема с каскадным удалением. Вот мой проект 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; }
Но я не могу решить эту проблему.