实体框架 - 模型自引用依赖关系不级联删除

时间:2015-09-18 18:16:29

标签: c# entity-framework ef-fluent-api

我有一个群组模型/表格:

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

表的视觉表示: Table relationships

我的群组(父/子)映射导致ON DELETE CASCADE无法“启用”会出现什么问题?它与相同类型的参考有关吗?

免责声明:我看过一些帖子说这是无法做到的,因为你“不能在SQL SERVER中的自引用表上使用CASCADE DELETE”。 (Entity Framework 6 Code-First cascade delete on self referencing entity)。我在这种情况下使用映射表,所以情况应该不是这样。

1 个答案:

答案 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配备级联删除。它不能做到这两点。