带有 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);
    }