C# MVC EF向数据库添加对象

C# MVC EF向数据库添加对象,c#,asp.net-mvc,entity-framework,asp.net-mvc-3,orm,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 3,Orm,这是问题的继续 我在下面尝试: public DbSet<User> Users { get; set; } public DbSet<Sport> Sports { get; set; } public DbSet<Team> Teams { get; set; } 公共数据库集用户{get;set;} 公共数据库集运动{get;set;} 公共DbSet团队{get;set;} 我可以做很多运动 在一项运动中我可以有很多队 我可以在一个用户中拥有多个

这是问题的继续

我在下面尝试:

public DbSet<User> Users { get; set; }
public DbSet<Sport> Sports { get; set; }
public DbSet<Team> Teams { get; set; }
公共数据库集用户{get;set;}
公共数据库集运动{get;set;}
公共DbSet团队{get;set;}
  • 我可以做很多运动
  • 在一项运动中我可以有很多队
  • 我可以在一个用户中拥有多个团队
  • 我可以在一个团队中拥有许多用户
运动

public int ID { get; set; }
public List<Team> Teams { get; set; }
public int ID{get;set;}
公共列表组{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-ID、int-SportID、int-Wins、int-loss、字符串名称、字符串描述、双重声誉、列表成员、byte[]TeamLogo)
{
this.ID=ID;
this.SportID=SportID;
这个。赢=赢;
这个.损失=损失;
this.Name=Name;
这个。描述=描述;
这个。声誉=声誉;
这.成员=成员;
this.TeamLogo=TeamLogo;
}
公共int ID{get;set;}
公共列表成员{get;set;}
public int SportID{get;set;}
用户

public int UserID { get; set; }
public List<Team> Teams { get; set; }
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);
public int UserID{get;set;}
公共列表组{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();
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//在用户和团队之间添加中间表
modelBuilder.Entity()
.HasMany(t=>t.Teams)
.有许多(m=>m个成员)
.Map(w=>w.ToTable(“用户团队”)
.MapLeftKey(“用户ID”)
.MapRightKey(“团队ID”);
}
公共团队(团队、弦乐运动)
{
//将团队添加到正确的运动中
团队。添加(团队);
这是SaveChanges();
}
控制器

public int UserID { get; set; }
public List<Team> Teams { get; set; }
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);
model.NewTeam=新团队(0,db.getSportID(model.SelectedSport),0,0,model.TeamName,model.TeamDescription,
100,新列表(){model.currentUser},model.ActualImage);
db.addTeam(model.NewTeam,model.SelectedSport);
问题:


它将记录添加到Teams表中。它将记录添加到UserTeam表中。问题是它还向用户表添加了一条新记录,因此我的用户表中有重复用户。此外,当我查询Teams表时,我会得到一个空的成员列表,因此EF无法正确地从Many Many表中获取每个团队的成员。

此问题来自以下代码:

public void addTeam(Team team, String sport)
{
    // Add the team to the correct sport
    Teams.Add(team);
    this.SaveChanges();
}
Teams.Add(team)
将浏览
team
实例、所有导航属性、每个导航集合中的每个项目,并将它们标记为有新条目。这意味着每个条目都将有其状态Equalas
EntityState.Added
。然后,当您调用
this.SaveChanges()
时,它将为每个具有
EntityState.Added
状态的条目在数据库中创建新行

要解决问题,您需要确保用于保存数据的上下文与用于检索以下列表中使用的项的上下文相同
new list(){model.currentUser}

如果您的上下文不相同,则在
addTeam
方法上,您需要更改每个
用户的状态,并将其标记为
EntityState。未更改的
因此上下文不会将其添加为新创建的条目,如下所示:

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

此问题源于此代码:

public void addTeam(Team team, String sport)
{
    // Add the team to the correct sport
    Teams.Add(team);
    this.SaveChanges();
}
Teams.Add(team)
将浏览
team
实例、所有导航属性、每个导航集合中的每个项目,并将它们标记为有新条目。这意味着每个条目都将有其状态Equalas
EntityState.Added
。然后,当您调用
this.SaveChanges()
时,它将为每个具有
EntityState.Added
状态的条目在数据库中创建新行

要解决问题,您需要确保用于保存数据的上下文与用于检索以下列表中使用的项的上下文相同
new list(){model.currentUser}

如果您的上下文不相同,则在
addTeam
方法上,您需要更改每个
用户的状态,并将其标记为
EntityState。未更改的
因此上下文不会将其添加为新创建的条目,如下所示:

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

谢谢,问题正是你说的。new List()不是数据库中的上下文,因此它正在数据库中创建新的用户对象。一个简单的选择,我的当前用户修复了它。谢谢谢谢,问题正是你说的。new List()不是数据库中的上下文,因此它正在数据库中创建新的用户对象。一个简单的选择,我的当前用户修复了它。谢谢