我有标准的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设置还是我尝试创建团队对象的方式?
答案 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();