首页 > 解决方案 > 2个指向同一张表的外键

问题描述

我正在尝试创建一个 API 来管理足球比赛。我正在使用具有代码优先方法和域驱动设计 (DDD) 的 Entity Framework Core。我被 和 之间的关系所Player困扰Match

基本上,每场比赛都有 2 名球员(HostGuest),所以我试图将 2 个 FK(HomePlayerIdGuestPlayerId)指向同一张桌子,但我得到了一个例外:

无法确定“Player”类型的导航“Match.HomePlayer”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。

Player班级:

public class Player : Entity
{
        private  List<Match> _matches;

        public string Name { get; private set; }
        public Team Team { get; private set; }

        public Group Group { get; private set; }

        public IReadOnlyCollection<Match> Matches { get => _matches.ToArray(); }

        public Player(string name, Team team)
        {
            Name = name;
            Team = team;
            _matches = new List<Match>();
        }

        protected Player() { }
}

Match班级:

public class Match : Entity
{
        public Guid HomePlayerId { get; private set; }
        public Player HomePlayer { get; private set; }
        public Guid GuestPlayerId { get; private set; }
        public Player GuestPlayer { get; private set; }
        public int GoalsHomeTeam { get; private set; }
        public int GoalsGuestTeam { get; private set; }
        public DateTime MatchDate { get; private set; }

        public Match(Player homePlayer, Player guestPlayer, int goalsHomeTeam, int goalsGuestTeam)
        {
            HomePlayer = homePlayer;
            GuestPlayer = guestPlayer;
            GoalsHomeTeam = goalsHomeTeam;
            GoalsGuestTeam = goalsGuestTeam;
            MatchDate = DateTime.Now;
        }

        protected Match() { }
}

基础实体:

public abstract class Entity : IEntity
{
    protected Entity()
    {
        Id = Guid.NewGuid();
    }

    public Guid Id { get; set; }
}

DbContext

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> opt) : base(opt)
    {
    }

    public DbSet<Group> Groups { get; set; }
    public DbSet<Player> Players{ get; set; }
    public DbSet<Match> Matches{ get; set; }
    public DbSet<Team> Teams{ get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
    }
}

我怎样才能建立我的模型来建立这种关系?

标签: c#databaseormentity-framework-core

解决方案


推荐阅读