Два внешних ключа к одной и той же таблице в EF Core - PullRequest
0 голосов
/ 25 июня 2019

Я создаю базу данных SQL, используя структуру сущностей и свободный API. По сути, в игре 2 игрока, и при создании игры будет назначен только Player1. До сих пор я создал следующий код:

public class Game
{
    public int ContextId { get; set; }
    public DateTime DateStart { get; set; }
    public DateTime? DateEnd { get; set; }

    public virtual Player Player1 { get; set; }
    public virtual Player Player2 { get; set; }
}

public class Player
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual IList<Game>  Games { get; set; }
}


public void Configure(EntityTypeBuilder<Game> gameConfiguration)
{
    gameConfiguration.ToTable("games", GameDbContext.DEFAULT_SCHEMA);
    gameConfiguration.HasKey(c => c.ContextId).Metadata.AddAnnotation("DatabaseGenerated", DatabaseGeneratedOption.None);
    gameConfiguration.Property(c => c.ContextId).ValueGeneratedNever();
    gameConfiguration.Property(c => c.DateStart).IsRequired();
    gameConfiguration.Property(c => c.DateEnd).IsRequired(false);

    gameConfiguration.HasOne(c => c.Player1).WithMany(g => g.Games).HasForeignKey("ForeignKey_Game_Player1");
    gameConfiguration.HasOne(c => c.Player2).WithMany(g => g.Games).HasForeignKey("ForeignKey_Game_Player2");
}

Я получаю исключение при запуске приложения.

InvalidOperationException: невозможно создать связь между «Player.Games» и «Game.Player2», потому что уже есть отношения между Player.Games и Game.Player1. навигация свойства могут участвовать только в одном отношении.

Как мне этого добиться?

1 Ответ

0 голосов
/ 25 июня 2019

Вы можете определить свои отношения, как показано ниже.

public virtual IList<Game>  CreatedGames { get; set; }
public virtual IList<Game>  ParticipatedGames { get; set; }

И настройте их следующим образом.

gameConfiguration.HasOne(c => c.Player1).WithMany(g => g.CreatedGames).HasForeignKey("ForeignKey_Game_Player1");
gameConfiguration.HasOne(c => c.Player2).WithMany(g => g.ParticipatedGames).HasForeignKey("ForeignKey_Game_Player2");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...