我有一个群组模型/表格:
namespace Project
{
#region Usings
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
#endregion
[Table("Groups")]
public class Group
{
public Group()
{
this.Pk = Guid.NewGuid();
}
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Key]
[Required]
public Guid Pk
{
get;
set;
}
public virtual ICollection<Group> Parents
{
get;
set;
}
public virtual ICollection<Group> Children
{
get;
set;
}
public virtual ICollection<Document> Documents
{
get;
set;
}
...
}
一个小组可以有许多小组作为孩子或父母,以及许多文件。
我在Fluent API中连接的关系是这样的:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Group>()
.HasMany(e => e.Parents)
.WithMany(e => e.Children)
.Map(e =>
{
e.MapLeftKey("ParentPk");
e.MapRightKey("ChildPk");
e.ToTable("GroupMappings");
});
modelBuilder.Entity<Group>()
.HasMany(e => e.Documents)
.WithMany(e => e.Groups)
.Map(e =>
{
e.MapLeftKey("DocumentPk");
e.MapRightKey("GroupPk");
e.ToTable("DocumentMappings");
});
}
当我为这些模型生成SQL时,组和文档(DocumentMappings)之间的关系具有ON DELETE CASCASDE:
ALTER TABLE [dbo].[DocumentMappings] ADD CONSTRAINT [FK_dbo.DocumentMappings_dbo.Documents_GroupPk] FOREIGN KEY ([GroupPk]) REFERENCES [dbo].[Documents] ([Pk]) ON DELETE CASCADE
但GroupMappings没有:
ALTER TABLE [dbo].[GroupMappings] ADD CONSTRAINT [FK_dbo.GroupMappings_dbo.Groups_ParentPk] FOREIGN KEY ([ParentPk]) REFERENCES [dbo].[Groups] ([Pk])
ALTER TABLE [dbo].[GroupMappings] ADD CONSTRAINT [FK_dbo.GroupMappings_dbo.Groups_ChildPk] FOREIGN KEY ([ChildPk]) REFERENCES [dbo].[Groups] ([Pk])
我的群组(父/子)映射导致ON DELETE CASCADE无法“启用”会出现什么问题?它与相同类型的参考有关吗?
免责声明:我看过一些帖子说这是无法做到的,因为你“不能在SQL SERVER中的自引用表上使用CASCADE DELETE”。 (Entity Framework 6 Code-First cascade delete on self referencing entity)。我在这种情况下使用映射表,所以情况应该不是这样。
答案 0 :(得分:0)
它与相同类型的引用有关吗?
是的。 GroupMappings
表有两个外键。如果您尝试将bot设置为级联删除,则会出现此异常:
介绍FOREIGN KEY约束&#39; contraintName&#39;在桌面&#39; GroupMappings&#39;可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
使用两个外键,如果删除Group
,则会有多个级联路径删除GroupMappings
。 Sql Server具有此限制,即使路径最终位于同一个表中,它也不允许这样做。
EF知道这个限制,并不想为你选择哪个FK配备级联删除。它不能做到这两点。