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