【问题标题】:Why do I have to turn off cascade delete here in Entity Framework?为什么我必须在实体框架中关闭级联删除?
【发布时间】:2016-05-20 12:26:43
【问题描述】:

我这里有两个模型:

public class Student
{
    [Key]
    public Guid Id { get; set; }

    public ApplicationUser User { get; set; }

    [Display(Name = "Name"), Required]
    public string Name { get; set; }

    public ICollection<Assessment> SentAssessment { get; set; }

    public ICollection<Assessment> ReceivedAssessment { get; set; }
}

public class Assessment
{
    [Key]
    public Guid Id { get; set; }

    public Student Source { get; set; }

    public Student Target { get; set; }

    [Display(Name = "Assessment Content")]
    public string Content { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Assessment>()
        .HasRequired(eval => eval.Source)
        .WithMany(stu => stu.SentAssessment)
        .Map(conf => conf.MapKey("SourceId"))
        .WillCascadeOnDelete();

    modelBuilder.Entity<Assessment>()
        .HasRequired(eval => eval.Target)
        .WithMany(stu => stu.ReceivedAssessment)
        .Map(conf => conf.MapKey("TargetId"))
        .WillCascadeOnDelete();
}

在此设计中,用户(学生)可以对他人进行评估。他或她可以看到他/她给别人和从别人那里得到的评估。

删除学生时,应删除他/她发送或接收的所有评估。所以我写了 WillCascadeOnDelete 语句,但我得到一个错误:

在表“Evaluations”上引入 FOREIGN KEY 约束“FK_dbo.Evaluations_dbo.Students_TargetId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

这里的“循环或多级联路径”在哪里?

【问题讨论】:

  • modelBuilder.Conventions.Remove&lt;OneToManyCascadeDeleteConvention&gt;();下面base.OnModelCreating...怎么样

标签: asp.net-mvc database entity-framework


【解决方案1】:

这是因为当Student 中发生级联删除时,数据库不知道应该以哪个顺序删除Assessment。您必须手动告诉数据库如何操作:

create trigger T_Student_D
on Student
instead of delete
as
    set nocount on
    delete from Assessment
    where TargetId in (select ID from deleted) or
    SourceId in (select ID from deleted)

    delete from Student where ID in (select ID from deleted)

多个外键指向同一个实体是很常见的问题。

【讨论】:

    猜你喜欢
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多