实体框架6,级联删除映射连接表

时间:2015-11-21 10:05:43

标签: entity-framework ef-code-first entity-framework-6 ef-migrations

我有简单的“图形”表示存储在数据库中。 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中,我有:

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 - 所以当我删除节点时它会清除所有引用? (...并且在没有连接表实体的情况下保持模型简单)

1 个答案:

答案 0 :(得分:0)

当多对多关联是自引用时,EF选择创建外键而不是级联。如果它会使两个键级联,那么将存在循环级联,Sql Server不允许。显然,EF不想为你选择哪两个键应该级联,所以它没有选择。

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