在代码优先中配置1:N关系删除级联失败

时间:2018-08-10 20:43:44

标签: c# asp.net-mvc-5 entity-framework-6

我很难获得Code First模型的这一点来生成数据库。

这里是有问题的两个模型:

public class Workflow : BaseEntity, IBaseEntity
{
    public string Name { get; set; }
    public string Description { get; set; }
    public bool Published { get; set; }
    public DateTime? PublishedOn { get; set; }

    public int Revision { get; set; } = 0;
    public Guid PermanentId { get; set; }

    public virtual ICollection<WorkflowStage> WorkflowStages { get; set; }
    public virtual ICollection<WorkflowDataFactor> WorkflowDataFactors { get; set; }
    public virtual ICollection<WorkflowInstance> WorkflowInstances { get; set; }

}

这是第二个模型:

public class WorkflowStage : BaseEntity, IBaseEntity
{

    public int WorkflowId { get; set; }
    public virtual Workflow Workflow { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }
    public string Color { get; set; }
    public int Order { get; set; }
    public int Revision { get; set; } = 0;
    public Guid PermanentId { get; set; }

    public virtual ICollection<WorkflowStageStep> WorkflowStageSteps { get; set; }
    public virtual ICollection<WorkflowStageInstance> WorkflowStageInstances { get; set; }


}

BaseEntity为我所有其他实体提供Id属性,这是主键。

出现此错误后:

  

介绍FOREIGN KEY约束   桌上的'FK_dbo.WorkflowStage_dbo.Workflow_WorkflowId'   “ WorkflowStage”可能会导致循环或多个级联路径。指定开启   删除无操作或按更新无操作,或修改其他外键   约束。无法创建约束或索引。见前   错误。

我在上下文类中实现了这一点

modelBuilder.Entity<Workflow>().HasMany(x => x.WorkflowStages).WithRequired().WillCascadeOnDelete(false);

如果我理解正确,那就是说如果删除WorkflowStage,则不应删除关联的Workflow

不是EF6根据顶部的错误寻找什么吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

将上下文类中的代码更改为:

modelBuilder.Entity<Workflow>() .HasOptional<WorkflowStages>(s => s.WorkflowStages) .WithMany() .WillCascadeOnDelete(false);

答案 1 :(得分:0)

“在表'WorkflowStage'上引入FOREIGN KEY约束'FK_dbo.WorkflowStage_dbo.Workflow_WorkflowId'可能会导致循环或多个级联路径...”

这可能意味着您有多个表导致另一个表,并且每个表都有OnCascade设置。您无法在SQL Server中执行此操作。

Table1 ==>具有级联的Table2 Table3 ==> Table2 with Cascade <<-不,不,不!

那么多少个表与WorkFlowStage交互?有多个表可以级联吗?通过从一个表或另一个表中删除级联,是否有可能结束孤立记录?例如,如果您从WorkFlow中删除级联删除,那么是否可以使用不属于任何内容的WorkFlowStage?也许从其他涉及的表中删除级联会更合适。 在某些情况下,我在表上创建了AFTER DELETE触发器,该触发器可用于清理无约束的子记录。 HTH, 迈克