首页 >后端开发 >C++ >如何首先在实体框架代码中处理多个外国键?

如何首先在实体框架代码中处理多个外国键?

DDD
DDD原创
2025-01-29 07:55:09457浏览

How to Handle Multiple Foreign Keys to the Same Table in Entity Framework Code First?

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>

在此模型中:

  • Team 实体包含两个比赛集合:HomeMatches 和 AwayMatches。
  • Match 实体具有 HomeTeamId 和 GuestTeamId。
  • 在 OnModelCreating() 中,我们使用 Fluent API 配置关系。这可以防止循环引用。
  • 我们显式设置 OnDelete(DeleteBehavior.Restrict) (或 DeleteBehavior.NoAction) 以防止由于自引用多对多关系导致的级联删除。

通过这种方法,您可以成功地在 EF Core 模型中建立指向同一表的多个外键。 注意,WillCascadeOnDelete(false) 在较新的 EF Core 版本中已被弃用,建议使用 OnDelete(DeleteBehavior.Restrict)OnDelete(DeleteBehavior.NoAction)Restrict 会阻止删除操作,除非相关记录不存在;NoAction 会忽略删除操作,这取决于数据库提供程序的行为。 选择哪个取决于您的具体需求。

以上是如何首先在实体框架代码中处理多个外国键?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn