两种关系都可以使用 MatchId 作为外键

Both relationships could use MatchId as foreign key

我首先遇到 EF Core 代码问题 class 对象映射。我有一个 class Match,其中我有 A 队和 B 队的属性。

public class Match: MyEntity
    {
        public virtual Team TeamA { get; private set; }

        public virtual Team TeamB { get; private set; }

        public GameType GameType { get; private set; }

        public MatchStatus Status { get; private set; }

        public Match()
        {
 
        }

这是我的团队实体,我在其中参考了 MatchId

    public class Team: MyEntity
    {
        public virtual int MatchId { get; private set; }

        private Team()
        { }
        ...
    }

所以我需要 MatchId 与 TeamA 和 TeamB 相同,以防他们在同一场比赛中。 当我尝试创建迁移时,出现错误:

'Team'和'Match.TeamA'之间以及'Team'和'Match.TeamB'之间的关系都可以使用{'MatchId'}作为外键.要解决此问题,请在 'OnModelCreating' 中对至少一个关系显式配置外键属性。


 builder.Entity<Team>()
.HasOne<Match>()
.WithOne(x => x.TeamA)
.HasForeignKey<Team>(x => x.MatchId);
  
builder.Entity<Team>()
.HasOne<Match>()
.WithOne(x => x.TeamB)
.HasForeignKey<Team>(x => x.MatchId); 

当我使用此配置时它可以工作,但它正在迁移中删除 TeamAIdTeamBId 来自 Matches table 的列并在 Team table 中创建两列:MatchIdMatchId1.

      migrationBuilder.DropColumn(
                name: "TeamAId",
                table: "Matches");

            migrationBuilder.DropColumn(
                name: "TeamBId",
                table: "Matches");

            migrationBuilder.AddColumn<int>(
                name: "MatchId",
                table: "Teams",
                type: "int",
                nullable: false,
                defaultValue: 0);

            migrationBuilder.AddColumn<int>(
                name: "MatchId1",
                table: "Teams",
                type: "int",
                nullable: true);

也许我错过了什么?

我该如何解决这个问题?

感谢您的帮助。

我已经修复了它,不依赖于默认的 EF Core 配置,而是在 OnModelCreating 中依赖于我的配置。希望我做对了,有人可以告诉我是否看到了什么错误。

 builder.Entity<Team>(b =>
            {
                b.HasOne<Match>()
                    .WithOne(x => x.TeamA)
                    .HasForeignKey<Team>(x => x.MatchId);

                b.HasOne<Match>()
                    .WithOne(x => x.TeamB)
                    .HasForeignKey<Team>(x => x.MatchId);
            });

   builder.Entity<Match>(b =>
            {
                   b.HasOne<Team>("TeamA")
                  .WithMany()
                    .HasForeignKey("TeamAId");

                b.HasOne<Team>("TeamB")
                    .WithMany()
                    .HasForeignKey("TeamBId");

                b.Navigation("TeamA");

                b.Navigation("TeamB");
            });