C# EF Core在多对多表中插入

C# EF Core在多对多表中插入,c#,asp.net-core,razor-pages,ef-core-2.0,C#,Asp.net Core,Razor Pages,Ef Core 2.0,我用Razor页面构建了我的用户模型,并在create页面上插入连接表UserRoles上的用户角色 这是我的模型 [Table("Users")] public class User { public User() { IsActivo = true; } public int Id { get; set; } [Required] [Display(Prompt = "Username")] pu

我用Razor页面构建了我的用户模型,并在create页面上插入连接表UserRoles上的用户角色

这是我的模型

[Table("Users")]
public class User
{
    public User()
    {
        IsActivo = true;          
    }

    public int Id { get; set; }

    [Required]
    [Display(Prompt = "Username")]
    public string Username { get; set; }
    [Display(Name = "Último Acesso")]
    public DateTime? DataSessao { get; set; }
    [Display(Name = "Activo")]
    public bool IsActivo { get; set; } 
    public Colaborador Colaborador { get; set; }

    public ICollection<UserRoles> UserRoles { get; set; }
}
这是创建模型

public class CreateModel : PageModel
{
    private readonly HutIS.Models.HutISContext _context;

    public CreateModel(HutISContext context)
    {
        _context = context;
    }

    public IActionResult OnGet()
    {
        DepartamentosOptions = _context.Departamento.Select(d =>
              new SelectListItem
                  {
                       Value = d.Id.ToString(),
                       Text = d.Nome
                  }).ToList();


        RolesOptions = _context.Roles.Select(d =>
                  new SelectListItem
                      {
                         Value = d.Id.ToString(),
                         Text = d.Type
                       }).ToList();

        return Page();
    }

    [BindProperty]
    public User User { get; set; }
    public List<SelectListItem> DepartamentosOptions { get; set; }
    public List<SelectListItem> RolesOptions { get; set; }

    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        _context.User.Add(User);

        await _context.SaveChangesAsync();

        return RedirectToPage("./Index");
    }
}
关于html

<div class="form-group">
    <label asp-for="User.UserRoles" class="control-label"></label>
    <select asp-for="User.UserRoles" asp-items="Model.RolesOptions" class="form-control form-control-sm">
        <option value="">Selecione um Departamento...</option>
    </select>
    <span asp-validation-for="User.UserRoles" class="text-danger"></span>
</div>
我不太清楚我该怎么做,当然这里有一个例外,但是如果它是User中的一个集合,我该如何绑定UserRoles呢

编辑

我解决了异常问题,它与模型属性有关。现在的问题是没有在UserRoles表中插入任何内容,我不确定该怎么做,因为它的用户没有指向UserRoles的导航属性

正如您所看到的关系是正确的,它将提交RoleId值而不是Role对象,您需要定义public ICollection UserRoleIds{get;set;}来接受RoleIds

请遵循以下步骤:

使用UserRoleIds定义ViewModel

剃刀模型

public class CreateModel : PageModel
{
    private readonly TestRazorContext _context;

    public CreateModel(TestRazorContext context)
    {
        _context = context;
    }

    public IActionResult OnGet()
    {
        RolesOptions = _context.Role.Select(d =>
                new SelectListItem
                {
                    Value = d.Id.ToString(),
                    Text = d.Type
                }).ToList();
        return Page();
    }

    [BindProperty]
    public UserVM User { get; set; }
    public List<SelectListItem> RolesOptions { get; set; }

    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }
        //create user
        var user = new User {
            Username = User.Username,
            //rest properties
        };
        _context.User.Add(user);
        await _context.SaveChangesAsync();
        //set user role
        var userRoles = new List<UserRoles>();
        foreach (var roleId in User.RoleIds)
        {
            userRoles.Add(new UserRoles
            {
                UserId = user.Id,
                RoleId = roleId
            });
        }
        _context.UserRole.AddRange(userRoles);
        await _context.SaveChangesAsync();
        return RedirectToPage("./Index");
    }
}
剃刀视图

<form method="post">
    <div class="form-group">
        <label asp-for="User.Username" class="control-label"></label>
        <input asp-for="User.Username" />
    </div>    
    <div class="form-group">
        <label asp-for="User.RoleIds" class="control-label"></label>
        <select multiple="multiple" asp-for="User.RoleIds" asp-items="Model.RolesOptions" class="form-control form-control-sm">
            <option value="">Selecione um Departamento...</option>
        </select>
        <span asp-validation-for="User.RoleIds" class="text-danger"></span>
    </div>
    <input type="submit" value="Submit"/>
</form>

你面临的问题/异常是什么?更新后的帖子,异常得到了解决,但没有插入任何内容。似乎在前端,你应该将现有用户角色分配给用户,可能创建新用户角色的逻辑在哪里?在另一个页面中,模型角色是使用razor CRUD构建的。我知道我可以单独完成这项工作,但我认为在创建用户时可以将角色分配给用户。已经创建了一些角色。我对问题进行了编辑,以反映这实际上是一个EF核心问题,而不是ASP.Net。您需要显式更新角色关系—这不是免费的。有关更多信息,请参阅
<form method="post">
    <div class="form-group">
        <label asp-for="User.Username" class="control-label"></label>
        <input asp-for="User.Username" />
    </div>    
    <div class="form-group">
        <label asp-for="User.RoleIds" class="control-label"></label>
        <select multiple="multiple" asp-for="User.RoleIds" asp-items="Model.RolesOptions" class="form-control form-control-sm">
            <option value="">Selecione um Departamento...</option>
        </select>
        <span asp-validation-for="User.RoleIds" class="text-danger"></span>
    </div>
    <input type="submit" value="Submit"/>
</form>