多级联路径错误 - 实体框架核心

问题描述:

我想安装使用实体框架的核心一个新的数据库,但调用命令“更新数据库内”的说法时,我得到一个错误:多级联路径错误 - 实体框架核心

"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; 
    } 
} 

我需要怎么做才能正确设置此设置?

我认为这是可以在你解决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