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])
);