I am designing a new application to track sports statistics with code-first migration. I have the bare minimum POCO setup. The problem is that I am not happy with the design specifically how the players, teams and tournaments are relating to each other. 

I appreciate any comments and suggestions.

**PlayerAccount class:**

    /// <summary>
    /// Player account is a separate entity from the actual user account.
    /// Player account allows a user to join teams and participate in a tournament.
    /// </summary>
    public class PlayerAccount
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string FirstName { get; set; }
        [Required]
        public string LastName { get; set; }
    
        /// <summary>
        /// TournamentPlayerKeys tells us which team this player is competing with 
        /// in a certain tournament.
        /// </summary>
        public virtual ICollection<PlayerTeamKey> PlayerTeamKeys { get; set; }
        public virtual ICollection<PlayerMatchStat> PlayerMatchStats { get; set; }
    }

**Team class:**

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    /// <summary>
    /// Team can be formed by a single user or a group of user. You'll need a team to join a tournament.
    /// A single user can form his own team. 
    /// </summary>
    public class Team
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
    
        public virtual ICollection<PlayerTeamKey> PlayerTeamKeys { get; set; }
        public virtual ICollection<TeamTournamentKey> TeamTournamentKeys { get; set; }
    }

**Tournament class:**

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    /// <summary>
    /// Tournaments are basically a collection of games in one event. 
    /// For example, Summer 2014 Basketball League.
    /// </summary>
    public class Tournament
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
    
        public virtual ICollection<TeamTournamentKey> TeamTournamentKeys { get; set; }
        public virtual ICollection<TournamentMatch> TournamentMatches { get; set; }
    }

On a tournament there are multiple instances of matches (games):

    /// <summary>
    /// Match represents one occurence of a game in a league.
    /// </summary>
    public class TournamentMatch
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public int Tournament_Id { get; set; }
    
        [ForeignKey("Tournament_Id")]
        public virtual Tournament Tournament { get; set; }
        public virtual ICollection<TournamentMatchResult> TournamentMatchResults { get; set; }
    }

And of course we have multiple instances of match results in one match. The `Score` property determines who is the winner.


    /// <summary>
    /// This is the result of a league match.
    /// </summary>
    public class TournamentMatchResult
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public int Match_Id { get; set; }
        [Required]
        public int Team_Id { get; set; }
        [Required]
        public double Score { get; set; }
    
        [ForeignKey("Match_Id")]
        public virtual TournamentMatch TournamentMatch { get; set; }
        [ForeignKey("Team_Id")]
        public virtual Team Team { get; set; }
        public virtual ICollection<PlayerMatchStat> PlayerMatchStat { get; set; }
    
    }

I have a multipart key that creates the relationship between a player and a team:

    /// <summary>
    /// This is a multipart key class that defines a player as part of a team.
    /// Mind the naming convension, from smaller entity to a bigger entity; Player > Team.
    /// </summary>
    public class PlayerTeamKey
    {
    
        [Required]
        public int PlayerAccount_Id { get; set; }
        [Required]
        public int Team_Id { get; set; }
    
        [ForeignKey("PlayerAccount_Id")]
        public virtual PlayerAccount Player { get; set; }
        [ForeignKey("Team_Id")]
        public virtual Team Team { get; set; }
    
    }

And I have another like that for team and tournament:

    /// <summary>
    /// This is a multipart key class that is a combination of a team id and a tournament id.
    /// This basically tells us that the team with the given id is going to participating on a tournament with the given id.
    /// </summary>
    public class TeamTournamentKey
    {
        [Required]
        public int Team_Id { get; set; }
        [Required]
        public int Tournament_Id { get; set; }
    
        [ForeignKey("Team_Id")]
        public virtual Team Team { get; set; }
        [ForeignKey("Tournament_Id")]
        public virtual Tournament Tournament { get; set; }
    
    }