Entity Framework6、mapped join的级联删除table
Entity Framework 6, cascade delete of mapped join table
我在数据库中存储了简单的 "graph" 表示。有 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
数据库上下文 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 方法中添加它。
我在数据库中存储了简单的 "graph" 表示。有 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
数据库上下文 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 方法中添加它。