2016-09-26 44 views
0

我是新來的MVC和我試圖找出如何將不同的模型視圖中的實例MVC 5級中的對象模型和數據庫存儲

Model Teams 
int TeamID 
string Team_Name 

Model Players 
int PlayerID 
string PlayerName 

現在我想存儲在該信息顯示連接數據庫,那麼我將如何去關聯這兩個?

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

Team_ID,我可以在一個數據庫表存儲,但隨後必須以某種方式包括組表時,我拉的球員名單。或TEAM Team,然後我可以通過modelItem.team.team_name查看團隊名稱,但不能在數據庫中存儲TEAM對象。

我知道這是基本的MVC方面,但我只是努力讓我的頭。

任何建議或解決方案的鏈接?

回答

1

實體類應該是這個樣子:

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(); 

如果你需要走另一條路,然後同樣

var players = team.Players.ToList(); 

,你可以急切地加載的球員,以儘量減少查詢:,你可以從Team一個實例加載的球員名單以及

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

對於它的價值,你的班級和財產名稱違反了慣例。注意我提供的示例代碼中的類和屬性名稱。實體類的名稱應始終爲單數:Team,而不是Teams。屬性名稱應該是pascal-cased並且一起運行:LikeThis,不像This或Like_This。另外,在屬性名稱中包含類名稱是一個反模式。例如,Name財產屬於Team,所以當然這是團隊的名稱。在前綴TeamTeamName)的前面有零點,它只會讓你的代碼更加冗長。例如,哪個更好:team.Nameteam.TeamName