EF Core - 对同一个表的多个引用

haa*_*gel 5 database entity-framework-core .net-core asp.net-core

首先使用 Entity Framework Core (5.0.1) 代码,我在实现一个对另一个类有两个引用的类时遇到问题。

这基本上是我想要的结构:

public class Location
{
    public int Id { get; set; }

    public string Name { get; set; }
}


public class Race
{
    public int Id { get; set; }

    public string Title { get; set; }

    public int? StartLocationId { get; set; }
    public Location StartLocation { get; set; }

    public int? EndLocationId { get; set; }
    public Location EndLocation { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这实际上工作得很好,但当我实现表单来创建新的 Race 时,我想添加一些验证属性:

public class Race
{
    public int Id { get; set; }

    [Required]
    public string Title { get; set; }

    [Required]
    public int? StartLocationId { get; set; }
    public Location StartLocation { get; set; }

    [Required]
    public int? EndLocationId { get; set; }
    public Location EndLocation { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

位置引用上的必需属性使得无法在数据库初始化时创建表(因为我正处于开发之初,所以我目前在所有启动时都运行该表)。这是我收到的错误消息:

在表“Races”上引入外键约束“FK_Races_Locations_StartLocationId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。

据我了解,这与级联删除问题有关。我可以在数据库中禁用级联删除,但我希望在 GUI 中验证需要这些属性。这可能吗?

对于我的模型类中非标准的其他关系,我使用 Fluent Api 进行配置,因此使用它的解决方案将是最好的。然而,解决问题是我的首要任务,因此使用属性的解决方案也可以。

我在 StackOverflow 上找到了其他线程,其中有非常类似的问题,但没有一个建议的解决方案对我有用(有些是针对实体框架的,而不是针对核心的):

EF Core 对同一实体的多个引用 EF Core 2.2 - 同一个表的两个外键 Entity Framework Code First - 来自同一个表的两个外键 Entity Framework 对同一个表的多次引用

haa*_*gel 9

我终于找到了解决办法!这就是我需要做的:

modelBuilder.Entity<Race>()
    .HasOne(r => r.StartLocation)
    .WithMany()
    .OnDelete(DeleteBehavior.Restrict);

modelBuilder.Entity<Race>()
    .HasOne(r => r.EndLocation)
    .WithMany()
    .OnDelete(DeleteBehavior.Restrict);
Run Code Online (Sandbox Code Playgroud)

我在这篇文章中找到了解决方案(感谢 Ivan Stoev!): 指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。- 如何?