2016-05-06 63 views
1

因此,这是问题的延续hereMVC EF添加对象数据库

我想下面这样:

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

问题:

它会添加记录到团队表就好了。它将记录添加到UserTeam表中就好了。问题是它也向用户表添加了新记录,所以我在用户表中重复了用户。此外,当我查询团队表时,我得到一个空List成员,因此EF没有从Many-Many表中正确地获取每个团队的成员。

回答

0

这个问题来自这个代码:

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(); 
} 
+0

谢谢你,问题是你说的到底是什么。新列表()不是来自数据库的上下文,因此它正在数据库中创建一个新的User对象。一个简单的选择我的当前用户修复它。谢谢! – bob