我是实体框架的新手,我已经尝试修复这个问题好几个小时了,但我现在完全不知所措。
有人能好心指出我在这里缺少什么吗?
当我尝试运行更新数据库时出现此错误:
在表“ContainerActies”上引入 FOREIGN KEY 约束“FK_ContainerActies_Locaties_LocatieId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 无法创建约束或索引。查看之前的错误。
我尝试在 OnModelCreating 中关闭级联删除:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ContainerActie>()
.HasOne(c => c.Locatie)
.WithMany(c => c.ContainerActies)
.HasForeignKey(c => c.LocatieId)
.OnDelete(DeleteBehavior.Restrict);
}
但是好像没有什么效果
public class ContainerActie : SQLModel
{
[Category("DB")]
[Key]
public int ContainerActieId { get; set; }
[Category("Info")]
public Container Container { get; set; }
[Category("Info")]
public Actie Actie { get; set; }
[Category("Info")]
public Relatie Relatie { get; set; }
[Category("Info")]
public int LocatieId { get; set; }
[Category("Info")]
public Locatie Locatie { get; set; }
[Category("Info")]
public DateTime DateTime { get; set; }
}
public class Locatie : SQLModel
{
[Category("DB")]
[Key]
public int LocatieId { get; set; }
[Category("Info")]
[Required]
public string Naam { get; set; }
[Category("Info")]
public string? Adres { get; set; }
[Category("Info")]
public string? Gemeente { get; set; }
[Category("Info")]
public string? Postcode { get; set; }
[Category("Info")]
public string? Tel { get; set; }
[Category("Info")]
public string? Commentaar { get; set; }
[Category("Info")]
public List<ContainerActie>? ContainerActies { get; set; }
}
这是因为外键
LocatieId
不可为空,如果该键不可为空则必须删除相关对象,而循环关系不允许这样做。
我在创建数据库表时也遇到了类似的错误,尽管您可以通过在 OnModelCreating 中显式定义它来解决此问题,但通过将 [DeleteBehavior(DeleteBehavior.ClientSetNull)] 添加到外部属性例如
[Category("Info")]
[DeleteBehavior(DeleteBehavior.ClientSetNull)]
public Actie Actie { get; set; }
对于连接表添加
[DeleteBehavior(DeleteBehavior.ClientCascade)]
相反。