2017-03-06 65 views
2

我想安裝使用實體框架的核心一個新的數據庫,但調用命令「更新數據庫內」的說法時,我得到一個錯誤:多級聯路徑錯誤 - 實體框架核心

"Introducing FOREIGN KEY constraint 'FK_Answers_Users_UserId' on table 'Answers' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints." 

我不計劃實際上從數據庫中刪除任何東西,但如果刪除了用戶,則將其設置爲刪除與用戶相關的所有內容。

這裏是我的模型:

public class User 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
    public string Username { get; set; } 
    public string ImageUrl { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime DateModified { get; set; } 
    public int AnswersFlagged { get; set; } 
    public bool Status { get; set; } 

    public IEnumerable<Dispute> Disputes { get; set; } 
    public IEnumerable<Answer> Answers { get; set; } 
} 

public class Dispute 
{ 
    public int Id { get; set; } 
    public int UserId { get; set; } 
    public int CategoryId { get; set; } 
    public string Text { get; set; } 
    public string OptionOneText { get; set; } 
    public string OptionTwoText { get; set; } 
    public string OptionThreeText { get; set; } 
    public string OptionOneImageUrl { get; set; } 
    public string OptionTwoImageUrl { get; set; } 
    public string OptionThreeImageUrl { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime DateModified { get; set; } 
    public bool Status { get; set; } 

    public User User { get; set; } 
    public Category Category { get; set; } 
    public IEnumerable<Answer> Answers { get; set; } 
} 

public class Answer 
{ 
    public int Id { get; set; } 
    public int DisputeId { get; set; } 
    public int UserId { get; set; } 
    public int SelectedOption { get; set; } 
    public string Comment { get; set; } 
    public bool Flagged { get; set; } 
    public DateTime DateCreated { get; set; } 

    public Dispute Dispute { get; set; } 
    public User User { get; set; } 
} 

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime DateCreated { get; set; } 
    public bool Status { get; set; } 

    public IEnumerable<Dispute> Disputes { get; set; } 
} 

public class DisputeCategory 
{ 
    public int Id { get; set; } 
    public int DisputeId { get; set; } 
    public int CategoryId { get; set; } 

    public Dispute Dispute { get; set; } 
    public Category Category { get; set; } 
} 

我試圖與我的DbContext沒有運氣的遵循:

1)

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Answer>() 
     .HasOne(p => p.User) 
     .WithMany(b => b.Answers) 
     .OnDelete(DeleteBehavior.Restrict); 
} 

2)

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
     modelBuilder.Entity<Answer>() 
      .HasOne(p => p.User) 
      .WithMany(b => b.Answers) 
      .IsRequired(false); 
} 

3)

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys())) 
    { 
     relationship.DeleteBehavior = DeleteBehavior.Restrict; 
    } 
} 

我需要怎麼做才能正確設置此設置?

回答

3

我認爲這是可以在你解決Answer實體,改變DisputeId可爲空:

public class Answer 
{ 
    public int Id { get; set; } 
    public int? DisputeId { get; set; } 
    //.. 

    public Dispute Dispute { get; set; } 
    //.. 
} 

和配置關係是這樣的:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Answer>() 
     .HasOne(p => p.User) 
     .WithMany(b => b.Answers) 
     .HasForeignKey(s =>s.UserId) ; 

    modelBuilder.Entity<Answer>() 
     .HasOne(p => p.Dispute) 
     .WithMany(b => b.Answers) 
     .HasForeignKey(s =>s.DisputeId) ; 
} 

第二個關係是可選的convention,所以應該解決你的問題。

EF core文件:

按照慣例,級聯刪除將被設置爲級聯所需 關係和限制可選的關係。級聯意味着從屬實體也被刪除。 限制意味着未加載到內存 中的相關實體將保持不變並且必須手動刪除,或更新爲 指向有效的主體實體。對於裝入 內存的實體,EF將嘗試將外鍵屬性設置爲空。

如果你有外鍵屬性在實體類,則關係 requiredness的基礎上確定是否需要 外鍵的屬性或可選

+0

感謝您的幫助! – Aaron

+0

不客氣;) – octavioccl