Entity Framework Code First:处理指向同一表的多个外键
在 Entity Framework Core 中,对实体间关系进行建模至关重要。正如您遇到的那样,创建具有指向同一表多个外键的模型可能会导致异常。
在您的示例中,您定义了 Team 和 Match 实体,目的是捕获团队和比赛之间的关系,其中一场比赛涉及两支球队,一支主队和一支客队。但是,您的初始方法会触发循环引用异常。
为了解决此问题,必须利用 HasRequired() 和 WithMany() 方法以及 OnModelCreating() 中的流畅 API 配置。这是一个更新后的模型:
<code class="language-c#">public class Team { public int TeamId { get; set; } public string Name { get; set; } public virtual ICollection<Match> HomeMatches { get; set; } public virtual ICollection<Match> AwayMatches { get; set; } } public class Match { public int MatchId { get; set; } public int HomeTeamId { get; set; } public int GuestTeamId { get; set; } public float HomePoints { get; set; } public float GuestPoints { get; set; } public DateTime Date { get; set; } public virtual Team HomeTeam { get; set; } public virtual Team GuestTeam { get; set; } } public class Context : DbContext { // ... protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Match>() .HasOne(m => m.HomeTeam) .WithMany(t => t.HomeMatches) .HasForeignKey(m => m.HomeTeamId) .OnDelete(DeleteBehavior.Restrict); // or DeleteBehavior.NoAction modelBuilder.Entity<Match>() .HasOne(m => m.GuestTeam) .WithMany(t => t.AwayMatches) .HasForeignKey(m => m.GuestTeamId) .OnDelete(DeleteBehavior.Restrict); // or DeleteBehavior.NoAction } }</code>
在此模型中:
OnDelete(DeleteBehavior.Restrict)
(或 DeleteBehavior.NoAction
) 以防止由于自引用多对多关系导致的级联删除。通过这种方法,您可以成功地在 EF Core 模型中建立指向同一表的多个外键。 注意,WillCascadeOnDelete(false)
在较新的 EF Core 版本中已被弃用,建议使用 OnDelete(DeleteBehavior.Restrict)
或 OnDelete(DeleteBehavior.NoAction)
。 Restrict
会阻止删除操作,除非相关记录不存在;NoAction
会忽略删除操作,这取决于数据库提供程序的行为。 选择哪个取决于您的具体需求。
以上是如何首先在实体框架代码中处理多个外国键?的详细内容。更多信息请关注PHP中文网其他相关文章!