模型和数据库存储中的 MVC 5 对象

MVC 5 Objects in Models and DB Storage

我是 MVC 的新手,我正在尝试了解如何连接不同的模型以在视图示例中显示

Model Teams
int TeamID
string Team_Name

Model Players
int PlayerID
string PlayerName

现在我想将此信息存储在数据库中,那么我将如何链接这两者?

所以在玩家模型中我可以使用 Team Team or int TeamID

Team_ID 我可以存储在数据库中 table 但是当我提取玩家列表时必须以某种方式包括团队 table。或 TEAM Team,然后我可以通过 modelItem.team.team_name 查看团队名称,但无法将 TEAM 对象存储在数据库中。

我知道这是 MVC 的基础,但我只是在努力理解它。

有任何建议或解决方案的链接吗?

您的实体 classes 应该类似于:

public  class Team
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Player> Players { get; set; }
}

public class Player
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    [ForeignKey("Team")]
    public int TeamId { get; set; }
    public virtual Team Team { get; set; }
}

这样,使用 Player 的实例,您可以简单地执行以下操作:

 player.Team.Name

获取团队名称。如果你有一组正在迭代的玩家,你应该首先急切地加载 Team,这样你就不会得到 N+1 个查询:

var players = db.Players.Include(m => m.Team).ToList();

如果你需要走另一条路,那么,你也可以从 Team 的实例加载玩家列表:

var players = team.Players.ToList();

同样,您可以预先加载播放器以尽量减少查询:

var team = db.Teams.Include(m => m.Players).SingleOrDefault(m => m.Id == teamId);

就其价值而言,您的 class 和 属性 名称违反惯例。请注意我提供的示例代码中的 class 和 属性 名称。实体 class 的名称应始终为单数:Team,而不是 Teams。 属性 名称应该是 pascal 大小写并且 运行 在一起:LikeThis,而不是 likeThis 或 Like_This。此外,在 属性 名称中包含 class 名称是一种反模式。例如Name 属性属于Team,当然是队名了。用 Team (TeamName) 作为前缀是零点,它只会让你的代码更冗长。例如,哪个读起来更好:team.Nameteam.TeamName?