【问题标题】:MVC EF Adding object to databaseMVC EF 将对象添加到数据库
【发布时间】:2016-09-01 18:38:29
【问题描述】:

所以这是问题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; }

数据库

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 表添加一条记录。它将记录添加到 UserTeam 表中就好了。问题是它也在用户表中添加了一条新记录,所以我的用户表中有重复的用户。此外,当我查询 Teams 表时,我得到一个 null List Members,因此 EF 无法从 Many-Many 表中正确获取每个团队的成员。

【问题讨论】:

    标签: c# asp.net-mvc entity-framework asp.net-mvc-3 orm


    【解决方案1】:

    这个问题来自这个代码:

    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&lt;User&gt;() { 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();
    }
    

    【讨论】:

    • 谢谢,问题正是你所说的。新的 List() 不是数据库的上下文,因此它在数据库中创建了一个新的 User 对象。一个简单的选择,我当前的用户在哪里修复它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多