2016-05-20 70 views
0

我來到這裏兩種型號:爲什麼我必須在實體框架中關閉級聯刪除?

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語句,但我得到一個錯誤:

Introducing FOREIGN KEY constraint 'FK_dbo.Evaluations_dbo.Students_TargetId' on table 'Evaluations' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

哪裏「循環或多個級聯路徑」在這裏?

+0

'modelBuilder.Conventions.Remove ();'base.OnModelCreating ...''下面''' – Hackerman

回答

0

這是因爲級聯刪除發生在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) 

這是多個引用同一實體的外鍵的常見問題。

相關問題