多级联路径错误 - 实体框架核心
问题描述:
我想安装使用实体框架的核心一个新的数据库,但调用命令“更新数据库内”的说法时,我得到一个错误:多级联路径错误 - 实体框架核心
"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的基础上确定是否需要 外键的属性或可选
感谢您的帮助! – Aaron
不客气;) – octavioccl