C# EF多对多关系添加数据

C# EF多对多关系添加数据,c#,entity-framework-6,C#,Entity Framework 6,我正在尝试使用C#中的entity framework v6.1.3实现用户和组之间的多对多关系(因此,一个用户可以位于多个组中,而组由一个或多个用户组成) 用户模型如下所示: User.cs public User() { this.Usergroups = new HashSet<Usergroup>(); } [Key] [Required] [MaxLength(150)] public string UserName { get; set; } public virtu

我正在尝试使用C#中的entity framework v6.1.3实现用户和组之间的多对多关系(因此,一个用户可以位于多个组中,而组由一个或多个用户组成)

用户模型如下所示: 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; }
public Usergroup() { this.Users= new HashSet<Users>(); }

[Key]
[Required]
[MaxLength(150)]
public string UserGroupName { get; set; }

public virtual ICollection<User> Users{ get; set; }
 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");
             });
     }
 }
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();
  }
public User(){this.Usergroups=new HashSet();}
[关键]
[必需]
[MaxLength(150)]
公共字符串用户名{get;set;}
公共虚拟ICollection用户组{get;set;}
组模型如下所示: Usergroup.cs

public User() { this.Usergroups = new HashSet<Usergroup>(); }

[Key]
[Required]
[MaxLength(150)]
public string UserName { get; set; }

public virtual ICollection<Usergroup> Usergroups { get; set; }
public Usergroup() { this.Users= new HashSet<Users>(); }

[Key]
[Required]
[MaxLength(150)]
public string UserGroupName { get; set; }

public virtual ICollection<User> Users{ get; set; }
 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");
             });
     }
 }
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();
  }
public Usergroup(){this.Users=new HashSet();}
[关键]
[必需]
[MaxLength(150)]
公共字符串UserGroupName{get;set;}
公共虚拟ICollection用户{get;set;}
在DbContext类中,我插入了数据库集和modelBuilder自动创建联接表的代码。 SqlDbContext.cs

public User() { this.Usergroups = new HashSet<Usergroup>(); }

[Key]
[Required]
[MaxLength(150)]
public string UserName { get; set; }

public virtual ICollection<Usergroup> Usergroups { get; set; }
public Usergroup() { this.Users= new HashSet<Users>(); }

[Key]
[Required]
[MaxLength(150)]
public string UserGroupName { get; set; }

public virtual ICollection<User> Users{ get; set; }
 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");
             });
     }
 }
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();
  }
公共类SqlDbContext:DbContext,IUnitOfWork
{
公共数据库集用户{get;set;}
公共数据库集用户组{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(s=>s.Usergroups)
.WithMany(c=>c.Users)
.Map(cs=>
{
cs.MapLeftKey(“UserRefId”);
cs.MapRightKey(“UsergroupRefId”);
cs.ToTable(“用户组概述”);
});
}
}
添加迁移后,将自动创建UsergroupOverview。在我的Configuration.cs的Seed方法中,我试图创建一些示例组和用户,并将它们相互分配,但不幸的是,User中的列Usergroups和User中的列Usergroups在db迁移后都不存在。 配置.cs

public User() { this.Usergroups = new HashSet<Usergroup>(); }

[Key]
[Required]
[MaxLength(150)]
public string UserName { get; set; }

public virtual ICollection<Usergroup> Usergroups { get; set; }
public Usergroup() { this.Users= new HashSet<Users>(); }

[Key]
[Required]
[MaxLength(150)]
public string UserGroupName { get; set; }

public virtual ICollection<User> Users{ get; set; }
 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");
             });
     }
 }
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();
  }
protected override void Seed(SqlDbContext上下文)
{
var usergroups=新列表{
新用户组{UserGroupName=“TestGroup”,RoleName=roles[1]。RoleName}
};
User-sampleUser=context.Users.Find(“用户”);
sampleUser.Usergroups.Add(Usergroups[1]);//将usergroup添加到用户
用户组[1]。用户。添加(sampleUser);//将用户添加到用户组
SaveChanges();
}
我错过了什么?是否需要在创建的联接表UsergroupOverview中添加用户/用户组?这是将用户分配给用户组的正确方法吗

提前感谢

试试:

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"));
public ActionResult EditPost(int?id,字符串[]selectedGroups)
{
if(id==null)
{
返回新的HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
//var courseToUpdate=db.Pracownicy.Find(id);
var userToUpdate=db.sprawy
.Include(i=>i.Usergroups)
.Where(i=>i.UserName=='user')
.Single();
如果(TryUpdateModel)(userToUpdate,“,
新字符串[]{“用户名”,“电子邮件”})
{
尝试
{
添加或更新(userToUpdate,SelectedGroup);
db.SaveChanges();
返回操作(“索引”);
}
捕获(retrylimitexeedexception/*dex*/)
{
//记录错误(取消注释dex变量名,并在此处添加一行以写入日志)。
ModelState.AddModelError(“,”无法保存更改。请重试,如果问题仍然存在,请与系统管理员联系。“);
}
}
返回视图(userToUpdate);
}
私有void AddorUpdate(用户spr,选择字符串[])
{
spr.Usergroups=新列表();
如果(所选==null)
{
spr.Usergroups=新列表();
返回;
}
var selectedGroupHS=新哈希集(已选定);
var Usergroup=newhashset(spr.Usergroups.Select(c=>c.Group_Id));
foreach(db.Usergroup中的变量ug)
{
if(selectedGroupHS.Contains(ug.Group\u Id.ToString()))
{
如果(!Usergroup.Contains(ug.Group_Id))
{
spr.Usergroups.Add(ug);
}
}
其他的
{
if(Usergroup.Contains(ug.Group_Id))
{
spr.Usergroups.Remove(ug);
}
}
}
}
modelBuilder.Entity()
.HasMany(c=>c.Usergroups)。
WithMany(i=>i.Users)
.Map(t=>t.MapLeftKey(“用户ID”)
.MapRightKey(“用户组\用户Id”)
.ToTable(“UsergroupOverview”);

这意味着您的seed方法没有调用数据库更新。我可以先向您展示一种在EF代码中进行种子设定的更安全的方法吗?当然可以,但我已经从package manager控制台调用了“update database”,这还不够吗?join表中的FKs已正确设置,但列(和示例项)已正确设置用户和用户组中仍然缺少-Table@hhfmn,请提供团队观众id和通行证好吗?