MVC EF 添加对象到数据库
MVC EF Adding object to database
所以这是问题的延续here
我在下面尝试这个:
public DbSet<User> Users { get; set; }
public DbSet<Sport> Sports { get; set; }
public DbSet<Team> Teams { get; set; }
- 我可以有很多运动
- 我可以在一项运动中拥有多个团队
- 我可以在一个用户中拥有多个团队
- 我可以在一个团队中有很多用户
运动
public int ID { get; set; }
public List<Team> Teams { get; set; }
团队
public Team(int ID, int SportID, int Wins, int Losses, String Name, String Description, double Reputation, List<User> Members, byte[] TeamLogo)
{
this.ID = ID;
this.SportID = SportID;
this.Wins = Wins;
this.Losses = Losses;
this.Name = Name;
this.Description = Description;
this.Reputation = Reputation;
this.Members = Members;
this.TeamLogo = TeamLogo;
}
public int ID { get; set; }
public List<User> Members { get; set; }
public int SportID { get; set; }
用户
public int UserID { get; set; }
public List<Team> Teams { get; set; }
DB
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Adds middle table between Users and Teams
modelBuilder.Entity<User>()
.HasMany<Team>(t => t.Teams)
.WithMany(m => m.Members)
.Map(w => w.ToTable("UserTeam")
.MapLeftKey("UserID")
.MapRightKey("TeamID"));
}
public void addTeam(Team team, String sport)
{
// Add the team to the correct sport
Teams.Add(team);
this.SaveChanges();
}
控制器
model.NewTeam = new Team(0, db.getSportID(model.SelectedSport), 0, 0, model.TeamName, model.TeamDescription,
100, new List<User>() { model.currentUser }, model.ActualImage);
db.addTeam(model.NewTeam, model.SelectedSport);
问题:
它向 Teams 添加记录 table 就好了。它将记录添加到 UserTeam table 就好了。问题是它还向用户 table 添加了一条新记录,因此我的用户 table 中有重复用户。此外,当我查询团队 Table 时,我得到一个空列表成员,因此 EF 无法正确地从多对多 table.
中获取每个团队的成员
这个问题来自这段代码:
public void addTeam(Team team, String sport)
{
// Add the team to the correct sport
Teams.Add(team);
this.SaveChanges();
}
行 Teams.Add(team)
将浏览 team
实例、所有导航属性、每个导航集合中的每个项目并将它们标记为有新条目。这意味着每个条目都有其状态等式 EntityState.Added
。然后,当您调用 this.SaveChanges()
时,它将为每个具有 EntityState.Added
状态的条目在您的数据库中创建新行。
要解决您的问题,您需要确保您用于保存数据的上下文与您用于检索您在以下列表中使用的项目的上下文相同new List<User>() { model.currentUser }
如果您的上下文不相同,那么在 addTeam
方法中您需要更改每个 User
的状态并将它们标记为 EntityState.Unchanged
这样上下文就不会添加它们作为新创建的条目,如下所示:
public void addTeam(Team team, String sport)
{
// Add the team to the correct sport
Teams.Add(team);
foreach(var user in team.Users)
{
this.Entry(user).EntityState = EntityState.Unchanged;
}
this.SaveChanges();
}
所以这是问题的延续here
我在下面尝试这个:
public DbSet<User> Users { get; set; }
public DbSet<Sport> Sports { get; set; }
public DbSet<Team> Teams { get; set; }
- 我可以有很多运动
- 我可以在一项运动中拥有多个团队
- 我可以在一个用户中拥有多个团队
- 我可以在一个团队中有很多用户
运动
public int ID { get; set; }
public List<Team> Teams { get; set; }
团队
public Team(int ID, int SportID, int Wins, int Losses, String Name, String Description, double Reputation, List<User> Members, byte[] TeamLogo)
{
this.ID = ID;
this.SportID = SportID;
this.Wins = Wins;
this.Losses = Losses;
this.Name = Name;
this.Description = Description;
this.Reputation = Reputation;
this.Members = Members;
this.TeamLogo = TeamLogo;
}
public int ID { get; set; }
public List<User> Members { get; set; }
public int SportID { get; set; }
用户
public int UserID { get; set; }
public List<Team> Teams { get; set; }
DB
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Adds middle table between Users and Teams
modelBuilder.Entity<User>()
.HasMany<Team>(t => t.Teams)
.WithMany(m => m.Members)
.Map(w => w.ToTable("UserTeam")
.MapLeftKey("UserID")
.MapRightKey("TeamID"));
}
public void addTeam(Team team, String sport)
{
// Add the team to the correct sport
Teams.Add(team);
this.SaveChanges();
}
控制器
model.NewTeam = new Team(0, db.getSportID(model.SelectedSport), 0, 0, model.TeamName, model.TeamDescription,
100, new List<User>() { model.currentUser }, model.ActualImage);
db.addTeam(model.NewTeam, model.SelectedSport);
问题:
它向 Teams 添加记录 table 就好了。它将记录添加到 UserTeam table 就好了。问题是它还向用户 table 添加了一条新记录,因此我的用户 table 中有重复用户。此外,当我查询团队 Table 时,我得到一个空列表成员,因此 EF 无法正确地从多对多 table.
中获取每个团队的成员这个问题来自这段代码:
public void addTeam(Team team, String sport)
{
// Add the team to the correct sport
Teams.Add(team);
this.SaveChanges();
}
行 Teams.Add(team)
将浏览 team
实例、所有导航属性、每个导航集合中的每个项目并将它们标记为有新条目。这意味着每个条目都有其状态等式 EntityState.Added
。然后,当您调用 this.SaveChanges()
时,它将为每个具有 EntityState.Added
状态的条目在您的数据库中创建新行。
要解决您的问题,您需要确保您用于保存数据的上下文与您用于检索您在以下列表中使用的项目的上下文相同new List<User>() { model.currentUser }
如果您的上下文不相同,那么在 addTeam
方法中您需要更改每个 User
的状态并将它们标记为 EntityState.Unchanged
这样上下文就不会添加它们作为新创建的条目,如下所示:
public void addTeam(Team team, String sport)
{
// Add the team to the correct sport
Teams.Add(team);
foreach(var user in team.Users)
{
this.Entry(user).EntityState = EntityState.Unchanged;
}
this.SaveChanges();
}