【问题标题】:EF Core - Multiple references to the same tableEF Core - 对同一个表的多次引用
【发布时间】:2021-01-21 04:43:44
【问题描述】:

首先使用 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; }
}

这实际上工作得很好,但是当我正在实现表单以创建一个新 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; }
}

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

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

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

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

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

EF Core Multiple References to Same Entity EF Core 2.2 - Two foreign keys to same table Entity Framework Code First - two Foreign Keys from same table Entity Framework multiple references to same table

【问题讨论】:

    标签: database asp.net-core .net-core entity-framework-core


    【解决方案1】:

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

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

    我在这篇文章中找到了解决方案(感谢 Ivan Stoev!): Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. - How?

    【讨论】:

      【解决方案2】:

      您是否尝试过 FluentApi 在 OnModelCreating 上执行此操作?

      public class AppContext : DbContext
      {
         protected override void OnModelCreating(DbModelBuilder modelBuilder)
         {
            // ...
            modelBuilder.Entity<Race>.Property(r => r.StartLocation).IsOptional();
            modelBuilder.Entity<Race>.Property(r => r.EndLocation).IsOptional();
         }
      
      }
      

      然后再次运行迁移,更新数据库,它应该可以工作

      【讨论】:

      • 我试过这个,但我得到了一个构建错误。我尝试在modelBuilder.Entity后面添加括号,但它仍然说没有IsOptional的定义。在对此进行一些搜索后,我了解到 EF Core 中没有 IsOptional 而是 IsRequired (相同但相反)。我试过了,这让我可以构建,但它仍然无法正常工作(“创建数据库时发生错误”)。我想当我用 fluent api 声明该属性不是必需的,但随后用模型类中的属性 [Required] 说它是必需的时,创建数据库会让人感到困惑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 2018-06-12
      • 1970-01-01
      • 2021-09-27
      • 2018-12-07
      • 2020-06-25
      相关资源
      最近更新 更多