【问题标题】:Entity Framework - Model Self-Referencing Dependencies Not Cascading Delete实体框架 - 模型自引用依赖不级联删除
【发布时间】:2015-09-19 04:57:09
【问题描述】:

我有一个组模型/表:

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)。在这种情况下,我使用的是映射表,所以应该不是这种情况。

【问题讨论】:

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


    【解决方案1】:

    它是否与它是同一类型的引用有关?

    是的。 GroupMappings 表有两个外键。如果您尝试将它们设置为级联删除,您将收到此异常:

    在表 'GroupMappings' 上引入 FOREIGN KEY 约束 'contraintName' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

    使用两个外键,如果您删除 Group,则会有多个级联路径来删除 GroupMappings。 Sql Server 有这个限制,它不允许这样做,即使路径最终位于同一个表中。

    EF 了解此限制,并且不想为您选择它配备了级联删除的 FK。它不能两者兼得。

    【讨论】:

    • 在创建模式后将两个 FK 都设置为 ON CASCADE DELETE 是否是一个有效的解决方案呢?在测试数据库中执行此操作后,它似乎正在工作。
    • 好吧,我不能让两个 FK 级联。 Sql Server 不允许它。但是一个就足够了,是的,这将是一个可行的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    相关资源
    最近更新 更多