模型和数据库存储中的 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.Name
或 team.TeamName
?
我是 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.Name
或 team.TeamName
?