EF 核心 - 如果使用数据批注,则出现多个级联路径错误,如果使用流畅 API,则出现重复键



没有外键注释的模型是;

Division {
[Key]
public int Id { get; set; }
public ICollection<Rooms> DivisionRooms { get; set; }
public ICollection<Desks> DivisionDesks { get; set; }
}
//------------------------------------------
Rooms {
[Key]
public int Id { get; set; }
public int DivisionId { get; set; }
public Division Division { get; set; }
public ICollection<Desks> DivisionDesks { get; set; }
}   
//------------------------------------------
Desks {
[Key]
public int Id { get; set; }
public int DivisionId { get; set; }
public Division Division { get; set; }
public int RoomId { get; set; }
public Room Room { get; set; }
}

使用流畅的 API,我可以创建索引等...如果我为此添加迁移,代码会自动正确选择外键,迁移代码都很好。但是当使用更新数据库命令创建数据库时,它说;

Introducing FOREIGN KEY constraint etc..etc.. may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

现在添加级联限制,如果我通过流畅的 apis 添加外键定义(例如:- 对于桌面实体(

builder.HasOne<Room>()
.WithMany()
.HasForeignKey(e => e.RoomId)
.OnDelete(DeleteBehavior.Restrict);

这将生成具有重复外键的迁移脚本。但是 Update-Database 可以工作并使用 Room 实体创建数据库,其中包含与其他两个实体的重复外键。

所以基本上,如果我使用数据注释;当运行更新数据库时,它会抱怨级联问题,如果我使用流畅的 API 并限制级联,它会创建重复的外键。

那么,如何在包含导航的情况下正确定义此模型呢?

builder.Entity<Division>()
.HasMany(x=>x.DivisionDesks)
.WithOne()
.OnDelete(DeleteBehavior.Restrict);
builder.Entity<Division>()
.HasMany(x=>x.DivisionRooms)
.WithOne()
.OnDelete(DeleteBehavior.Restrict);
builder.Entity<Room>()
.HasMany(x=>x.DivisionDesks)
.WithOne()
.OnDelete(DeleteBehavior.Restrict);

我认为您的问题在于您如何处理HasForeignKey这不是在 EF Core 上实际实现一对多关系的方式。此外,您不使用FlunterOR注释。双方正在合作。您可以使用注释来生成一些基本关系,然后使用流利来构造更复杂的数据。

使用HasForeignKey可以创建重复的,因为它已经通过命名约定与您的类一起定义。

另外,作为旁注,scema 可能不是最佳的,因为一个部门有多个房间,每个房间都有多个办公桌。所以我不会放置一个从部门到办公桌的直接导航属性,尽管这主要是关于数据库设计原则以及您希望它们如何规范化。

相关内容

最新更新