带有 List<> 的模型 .. 这如何与 Entity Framework 一起工作?
Models with List<> in them .. How does this work with Entity Framework?
我是 ASP.NET 的新手,想知道如何为包含其他模型列表的模型创建 CRUD 页面?我遵循 this tutorial,它为模型仅具有原始数据类型的简单场景创建 CRUD 页面。因此,创建的 DbContext 仅适用于教程中使用的那个模型。但是如果我有两个模型,它们之间是一对多的关系,比如下面的场景呢?
public class Player
{
public string name {get; set;}
public int age {get; set;}
public double salary {get; set;}
public string gender {get; set;}
public DateTime contractSignDate {get; set;}
}
public class Team
{
public string teamName {get; set;}
public string sportPlayed {get; set;}
public List<Player> players {get; set;}
}
如果我想为团队模型创建 CRUD 页面,我为其创建的 DbContext 仅引用该模型。事实上,VS2013 的脚手架引擎甚至都没有使用 players
列表,而是完全忽略它。
如何解决这个问题?
这是我为团队模型制作的 DbContext:
public class TeamDBContext : DbContext
{
public DbSet<Team> Teams { get; set; }
}
首先,您需要在 DBContext 中包含 Player
:
public class TeamDBContext : DbContext
{
public DbSet<Team> Teams { get; set; }
public DbSet<Player> Players { get; set; }
}
然后您可能会阅读这篇 article,它描述了如何加载相关实体。
可能你会这样添加:
public class Team
{
public string teamName {get; set;}
public string sportPlayed {get; set;}
public virtual ICollection<Player> players {get; set;}
}
首先,我将玩家 class 定义如下:
public class Player
{
//you need to define an identifier
public int PlayerId {get;set;}
public string Name {get; set;}
public int Age {get; set;}
public double Salary {get; set;}
public string Gender {get; set;}
public DateTime ContractSignDate {get; set;}
//you need a foreignkey
[ForeignKey("TeamId")]
public Team Team {get;set;}
public int TeamId {get;set;}
}
和团队 class:
public class Team
{
//you need an identifier
public int TeamId {get;set;}
public string TeamName {get; set;}
public string SportPlayed {get; set;}
public List<Player> Players {get; set;}
}
以及您的 dbcontext 文件:
public class TeamDBContext : DbContext
{
public DbSet<Team> Teams { get; set; }
public DbSet<Player> Players { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Player>()
.HasRequired(p => p.Team)
.WithMany(t => t.Players)
.HasForeignKey(p => p.TeamId)
}
}
而且,这就是你对新球队和球员的看法:
TeamDBContext db = new TeamDBContext();
//create a new player
Player p = new Player() {Name="make", Age=10, Salary=10, Gender="m" };
db.Players.Add(p);
db.SaveChanges();
//create a new team
Team t = new Team () {TeamName="barcelona", SportType="soccer"};
db.Teams.Add(t);
db.SaveChanges();
//add a player to a team
db.Teams.Include("Players").Players.Add(p);
db.SaveChanges();
public class Player
{
public string name {get; set;}
public int age {get; set;}
public double salary {get; set;}
public string gender {get; set;}
public DateTime contractSignDate {get; set;}
public IList<TeamPlayer> Team { get; set; }
}
public class Team
{
public string teamName {get; set;}
public string sportPlayed {get; set;}
public List<TeamPlayer> players {get; set;}
}
新建class
public class TeamPlayer
{
public int PlayerId { get; set; }
public Playler Player { get; set; }
public int TeamId { get; set; }
public Team Team { get; set; }
}
数据库上下文:
protected override void OnModelCreating(ModelBuilder constructor)
{
constructor.Entity<TeamPlayer >().HasKey(uc => new { uc.PlayerId, uc.TeamId });
base.OnModelCreating(constructor);
}
我是 ASP.NET 的新手,想知道如何为包含其他模型列表的模型创建 CRUD 页面?我遵循 this tutorial,它为模型仅具有原始数据类型的简单场景创建 CRUD 页面。因此,创建的 DbContext 仅适用于教程中使用的那个模型。但是如果我有两个模型,它们之间是一对多的关系,比如下面的场景呢?
public class Player
{
public string name {get; set;}
public int age {get; set;}
public double salary {get; set;}
public string gender {get; set;}
public DateTime contractSignDate {get; set;}
}
public class Team
{
public string teamName {get; set;}
public string sportPlayed {get; set;}
public List<Player> players {get; set;}
}
如果我想为团队模型创建 CRUD 页面,我为其创建的 DbContext 仅引用该模型。事实上,VS2013 的脚手架引擎甚至都没有使用 players
列表,而是完全忽略它。
如何解决这个问题?
这是我为团队模型制作的 DbContext:
public class TeamDBContext : DbContext
{
public DbSet<Team> Teams { get; set; }
}
首先,您需要在 DBContext 中包含 Player
:
public class TeamDBContext : DbContext
{
public DbSet<Team> Teams { get; set; }
public DbSet<Player> Players { get; set; }
}
然后您可能会阅读这篇 article,它描述了如何加载相关实体。
可能你会这样添加:
public class Team
{
public string teamName {get; set;}
public string sportPlayed {get; set;}
public virtual ICollection<Player> players {get; set;}
}
首先,我将玩家 class 定义如下:
public class Player
{
//you need to define an identifier
public int PlayerId {get;set;}
public string Name {get; set;}
public int Age {get; set;}
public double Salary {get; set;}
public string Gender {get; set;}
public DateTime ContractSignDate {get; set;}
//you need a foreignkey
[ForeignKey("TeamId")]
public Team Team {get;set;}
public int TeamId {get;set;}
}
和团队 class:
public class Team
{
//you need an identifier
public int TeamId {get;set;}
public string TeamName {get; set;}
public string SportPlayed {get; set;}
public List<Player> Players {get; set;}
}
以及您的 dbcontext 文件:
public class TeamDBContext : DbContext
{
public DbSet<Team> Teams { get; set; }
public DbSet<Player> Players { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Player>()
.HasRequired(p => p.Team)
.WithMany(t => t.Players)
.HasForeignKey(p => p.TeamId)
}
}
而且,这就是你对新球队和球员的看法:
TeamDBContext db = new TeamDBContext();
//create a new player
Player p = new Player() {Name="make", Age=10, Salary=10, Gender="m" };
db.Players.Add(p);
db.SaveChanges();
//create a new team
Team t = new Team () {TeamName="barcelona", SportType="soccer"};
db.Teams.Add(t);
db.SaveChanges();
//add a player to a team
db.Teams.Include("Players").Players.Add(p);
db.SaveChanges();
public class Player
{
public string name {get; set;}
public int age {get; set;}
public double salary {get; set;}
public string gender {get; set;}
public DateTime contractSignDate {get; set;}
public IList<TeamPlayer> Team { get; set; }
}
public class Team
{
public string teamName {get; set;}
public string sportPlayed {get; set;}
public List<TeamPlayer> players {get; set;}
}
新建class
public class TeamPlayer
{
public int PlayerId { get; set; }
public Playler Player { get; set; }
public int TeamId { get; set; }
public Team Team { get; set; }
}
数据库上下文:
protected override void OnModelCreating(ModelBuilder constructor)
{
constructor.Entity<TeamPlayer >().HasKey(uc => new { uc.PlayerId, uc.TeamId });
base.OnModelCreating(constructor);
}