两种关系都可以使用 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);
当我使用此配置时它可以工作,但它正在迁移中删除 TeamAId
和 TeamBId
来自 Matches
table 的列并在 Team
table 中创建两列:MatchId
和 MatchId1
.
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");
});
我首先遇到 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);
当我使用此配置时它可以工作,但它正在迁移中删除 TeamAId
和 TeamBId
来自 Matches
table 的列并在 Team
table 中创建两列:MatchId
和 MatchId1
.
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");
});