EF多对多关系添加数据

时间:2018-09-28 07:39:22

标签: c# entity-framework-6

我正在尝试使用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中添加用户/用户组?甚至是将用户分配给用户组的正确方法吗?

database diagram

预先感谢

1 个答案:

答案 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"));