尝试使用代码第一实体框架插入m2m的EntityValidationErrors

时间:2014-03-10 13:35:31

标签: asp.net entity-framework

我有标准的AspNetUsers表和团队表。

它们链接到名为UserTeam的m2m表 我将此属性添加到我的模型中以创建此m2m链接。

ApplicationUser

public virtual ICollection<Team> Teams { get; set; }

public virtual ICollection<ApplicationUser> TeamMembers { get; set; }

最后这段代码正确设置了m2m。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
    modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
    modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });

    modelBuilder.Entity<Team>()
        .HasMany(c => c.TeamMembers).WithMany(i => i.Teams)
        .Map(t => t.MapLeftKey("TeamId")
            .MapRightKey("TeamMemberId")
            .ToTable("UserTeam"));
}

现在我想要实现的是将我的用户(已插入的用户)添加到新的Team对象中,如下所示:

        // ... creation of user objects
        // add the members to the team m2m table
        newTeam.TeamMembers = new List<ApplicationUser>();
        newTeam.TeamMembers.Add(user1);
        newTeam.TeamMembers.Add(user2);

然后我最后尝试将团队对象添加到我的上下文中:

    using (var ctx = new ApplicationDbContext())
    {
        ctx.Teams.Add(newTeam);
        ctx.SaveChanges();
        return newTeam.Id;
    }

我一直在ctx.SaveChanges();行上收到EntityValidationErrors错误。

我的问题是我的工作不正确? 这是我的m2m设置还是我尝试创建团队对象的方式?

1 个答案:

答案 0 :(得分:0)

问题是我使用自己的UserManger类创建了我的用户,该类定义了它自己的Context。

然后,当我创建团队对象时,我正在实例化一个新的上下文,但会带来用户对象并尝试将它们添加到新的上下文中。这就是问题所在。

我现在的工作是使用我的UserManager创建用户,然后使用新的实例化上下文,然后从数据库中找到它们,然后将它们添加到Team对象中。

像这样:

        success = idManager.CreateUser(newUser, "xxxxxx");
        success = idManager.CreateUser(newUser2, "xxxxxx");

        success = idManager.AddUserToRole(newUser.Id, role);
        success = idManager.AddUserToRole(newUser2.Id, role);

        //create the team
        Team myTeam = new Team()
        {
            Name = "m2m team",
            TeamMembers = new List<ApplicationUser>()
        };

        var ctx = new ApplicationDbContext();

        // must go get the users using the new context here
        //
        var users = from u in ctx.Users
                    where u.UserName == user.UserName ||
                    u.UserName == user2.UserName
                    select u;
        ctx.Teams.Add(myTeam);
        foreach (var u in users)
        {
            myTeam.TeamMembers.Add(u);
        };
        ctx.SaveChanges();