Entity framework 实体框架6,映射联接表的级联删除

Entity framework 实体框架6,映射联接表的级联删除,entity-framework,ef-code-first,entity-framework-6,entity-framework-migrations,Entity Framework,Ef Code First,Entity Framework 6,Entity Framework Migrations,我在数据库中存储了简单的“图形”表示。有一个节点实体,它有它的ID,标签和相邻节点列表 public class Node { [Key] public int Id { get; set; } [StringLength(128)] public string Label { get; set; } public virtual ICollection<Node> AdjacentNodes { get; set; } } 现在,当我想

我在数据库中存储了简单的“图形”表示。有一个
节点
实体,它有它的
ID
标签
和相邻节点列表

public class Node
{
    [Key]
    public int Id { get; set; }

    [StringLength(128)]
    public string Label { get; set; }

    public virtual ICollection<Node> AdjacentNodes { get; set; }
}
现在,当我想删除任何已经有任何关系的节点时,我得到约束错误:

DELETE语句与引用约束“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])
);

有没有办法在删除级联上添加
,在连接表约束上添加
,这样当我删除节点时,它会清除所有引用?(…并保持模型简单,无需连接表实体)

当多对多关联是自引用时,EF选择创建外键作为非级联。如果这两个键都是级联的,那么就会出现循环级联,这是Sql Server不允许的。显然,EF不想为您选择这两个键中的哪一个应该级联,所以它不选择任何键


但是,您可以从
外键将
ON DELETE CASCADE
子句添加到FK_dbo.nodedge_dbo.Nodes_中,或者将其添加到migration Up方法中。

当多对多关联是自引用时,EF选择创建外键作为非级联。如果这两个键都是级联的,那么就会出现循环级联,这是Sql Server不允许的。显然,EF不想为您选择这两个键中的哪一个应该级联,所以它不选择任何键


但是,您可以从外键将
ON DELETE CASCADE
子句添加到FK_dbo.nodedge_dbo.Nodes_中,或者将其添加到migration Up方法中。

似乎
RemoveRange
有助于避免约束错误,但尽管引用项已被删除,联接表仍不会被清除(…有时我真的不知道EF在做什么)在fluent api中添加WillCascadeOnDelete(true)很遗憾,
WillCascadeOnDelete
不适用于多对多关系。查看此链接可能有助于您看起来
RemoveRange
有助于避免约束错误,但尽管引用的项已被删除,联接表仍未清除(…有时我真的不知道EF在做什么)在fluent api中添加WillCascadeOnDelete(true)?
WillCascadeOnDelete
不适用于多对多关系。请参阅此链接可能对您有所帮助
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])
);