EF 多对多关系添加数据



我正在尝试使用 C# 中的实体框架 v6.1.3 实现用户和组之间的多对多关系(因此 1 个用户可以在多个组中,并且组由 1 个或多个用户组成(。

用户模型如下所示:用户.cs

public User() { this.Usergroups = new HashSet<Usergroup>(); }
[Key]
[Required]
[MaxLength(150)]
public string UserName { get; set; }
public virtual ICollection<Usergroup> Usergroups { get; set; }

组模型如下所示:用户组.cs

public Usergroup() { this.Users= new HashSet<Users>(); }
[Key]
[Required]
[MaxLength(150)]
public string UserGroupName { get; set; }
public virtual ICollection<User> Users{ get; set; }

在 DbContext 类中,我插入了 DbSet 和 modelBuilder 的代码,以自动创建连接表。SqlDbContext.cs

public class SqlDbContext : DbContext, IUnitOfWork
{
public DbSet<User> Users { get; set; }
public DbSet<Usergroup> Usergroups{get; set;}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany<Usergroup>(s => s.Usergroups)
.WithMany(c => c.Users)
.Map(cs =>
{
cs.MapLeftKey("UserRefId");
cs.MapRightKey("UsergroupRefId");
cs.ToTable("UsergroupOverview");
});
}
}

添加迁移后,将自动创建用户组概述。在我的配置的 Seed 方法中.cs我试图创建一些示例组和用户并将它们相互分配,但不幸的是,在数据库迁移后,用户和反之亦然的列都不存在。配置.cs

protected override void Seed(SqlDbContext context)
{
var usergroups = new List<Usergroup> {
new Usergroup{ UserGroupName="TestGroup", RoleName=roles[1].RoleName}
};
User sampleUser = context.Users.Find("user");
sampleUser.Usergroups.Add(usergroups[1]); // add usergroup to user
usergroups[1].Users.Add(sampleUser);      // add user to usergroup    
context.SaveChanges();
}

我在这里错过了什么?是否需要在创建的连接表用户组概述中添加用户/用户组?这甚至是将用户分配到用户组的正确方法吗?

数据库示意图

提前致谢

尝试:

var userToUpdate = db.sprawy
.Include(i => i.Usergroups)
.Where(i => i.UserName  == 'user')
.Single();

它对我有用:

public ActionResult EditPost(int? id, string[] selectedGroups)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
// var courseToUpdate = db.Pracownicy.Find(id);
var userToUpdate = db.sprawy
.Include(i => i.Usergroups)
.Where(i => i.UserName  == 'user')
.Single();
if (TryUpdateModel(userToUpdate, "",
new string[] { "UserName","Email" }))
{
try
{
AddorUpdate(userToUpdate, selectedGroups);
db.SaveChanges();
return RedirectToAction("Index");
}
catch (RetryLimitExceededException /* dex */)
{
//Log the error (uncomment dex variable name and add a line here to write a log.
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
}
}
return View(userToUpdate);
}

private void AddorUpdate(User spr, string[] selected)
{
spr.Usergroups = new List<Usergroup>();
if (selected == null)
{
spr.Usergroups = new List<Usergroup>();
return;
}
var selectedGroupHS = new HashSet<string>(selected);
var Usergroup = new HashSet<int>(spr.Usergroups.Select(c => c.Group_Id));
foreach (var ug in db.Usergroup)
{
if (selectedGroupHS.Contains(ug.Group_Id.ToString()))
{
if (!Usergroup.Contains(ug.Group_Id))
{
spr.Usergroups.Add(ug);
}
}
else
{
if (Usergroup.Contains(ug.Group_Id))
{
spr.Usergroups.Remove(ug);
}
}
}
}
modelBuilder.Entity<User>()
.HasMany(c => c.Usergroups).
WithMany(i => i.Users)
.Map(t => t.MapLeftKey("User_ID")
.MapRightKey("Usergroups_Id")
.ToTable("UsergroupOverview"));

最新更新