Entity Framework6、mapped join的级联删除table

Entity Framework 6, cascade delete of mapped join table

我在数据库中存储了简单的 "graph" 表示。有 Node 个实体,它有 IDLabel 和相邻节点列表。

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

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

    public virtual ICollection<Node> AdjacentNodes { get; set; }
}

然后在 OnModelCreating 数据库上下文 class 中,我有:

modelBuilder.Entity<Node>()
    .HasMany(n => n.AdjacentNodes)
    .WithMany()
    .Map(n => n.MapLeftKey("From").MapRightKey("To").ToTable("NodeEdge"));

现在,当我想删除已经有任何关系的任何节点时,我得到约束错误:

The DELETE statement conflicted with the REFERENCE constraint "FK_dbo.NodeEdge_dbo.Nodes_From". The conflict occurred in database "master", table "dbo.NodeEdge", column 'From'. The statement has been terminated.

加入 table 看起来像这样:

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 on join table 约束 - 这样它会在我删除节点时清除所有引用? (...并在不加入 table 实体的情况下保持模型简单)

当多对多关联是自引用时,EF 选择创建外键为非级联。如果它会使两个键级联,就会有一个循环级联,Sql 服务器不允许。显然,EF 不想为您选择两个键中的哪一个应该级联,因此它选择 none.

不过,您可以在之后将 ON DELETE CASCADE 子句添加到 FK_dbo.NodeEdge_dbo.Nodes_From 外键,或者在迁移 Up 方法中添加它。