我有简单的“图形”表示存储在数据库中。 Node
实体有ID
,Label
和相邻节点列表。
public class Node
{
[Key]
public int Id { get; set; }
[StringLength(128)]
public string Label { get; set; }
public virtual ICollection<Node> AdjacentNodes { get; set; }
}
然后在数据库上下文类的OnModelCreating
中,我有:
modelBuilder.Entity<Node>()
.HasMany(n => n.AdjacentNodes)
.WithMany()
.Map(n => n.MapLeftKey("From").MapRightKey("To").ToTable("NodeEdge"));
现在,当我想要删除任何已经存在任何关系的节点时,我得到了约束错误:
DELETE语句与REFERENCE约束“FK_dbo.NodeEdge_dbo.Nodes_From”冲突。冲突发生在数据库“master”,表“dbo.NodeEdge”,列“From”中。 声明已经终止。
加入表如下所示:
CREATE TABLE [dbo].[NodeEdge] (
[From] INT NOT NULL,
[To] INT NOT NULL,
CONSTRAINT [PK_dbo.NodeEdge] PRIMARY KEY CLUSTERED ([From] ASC, [To] ASC),
CONSTRAINT [FK_dbo.NodeEdge_dbo.Nodes_From] FOREIGN KEY ([From]) REFERENCES [dbo].[Nodes] ([Id]),
CONSTRAINT [FK_dbo.NodeEdge_dbo.Nodes_To] FOREIGN KEY ([To]) REFERENCES [dbo].[Nodes] ([Id])
);
有没有办法在连接表约束上添加ON DELETE CASCADE
- 所以当我删除节点时它会清除所有引用? (...并且在没有连接表实体的情况下保持模型简单)
答案 0 :(得分:0)
当多对多关联是自引用时,EF选择创建外键而不是级联。如果它会使两个键级联,那么将存在循环级联,Sql Server不允许。显然,EF不想为你选择哪两个键应该级联,所以它没有选择。
然后,您可以在ON DELETE CASCADE
外键中添加FK_dbo.NodeEdge_dbo.Nodes_From
子句,或者在迁移Up方法中添加它。