我正在尝试使用C#中的实体框架v6.1.3建立用户与组之间的多对多关系(因此1个用户可以位于1个以上的组中,并且组由1个或多个用户组成)。
用户模型如下所示: User.cs
public User() { this.Usergroups = new HashSet<Usergroup>(); }
[Key]
[Required]
[MaxLength(150)]
public string UserName { get; set; }
public virtual ICollection<Usergroup> Usergroups { get; set; }
组模型如下所示: Usergroup.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");
});
}
}
添加迁移后,将自动创建UsergroupOverview。在我的Configuration.cs的Seed方法中,我试图创建一些示例组和用户并将它们彼此分配,但是不幸的是,数据库迁移后,User中的Usergroups列以及反之亦然。 Configuration.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();
}
我在这里想念什么?我是否需要在创建的联接表UsergroupOverview中添加用户/用户组?甚至是将用户分配给用户组的正确方法吗?
预先感谢
答案 0 :(得分:0)
尝试:
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"));