簡體   English   中英

EF核心插入多對多表

[英]EF Core Insert in many to many table

我用Razor Pages搭建了User模型,在創建頁面上我想在聯結表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>

我不確定我該怎么做,當然我會在這里遇到異常,但是如果UserRoles是User中的一個集合,該如何綁定UserRoles呢?

編輯

我解決了異常問題,它與模型屬性有關。 現在的問題是,沒有在UserRoles表上插入任何內容,我不太確定該怎么做,因為與部門相比,User的UserRoles沒有導航屬性。

在此處輸入圖片說明

如您所見,關系是正確的

對於<select multiple="multiple" asp-for="User.RoleIds" asp-items="Model.RolesOptions" class="form-control form-control-sm"> ,它將提交RoleId值而不是Role Object ,則需要定義public ICollection<int> UserRoleIds { get; set; } public ICollection<int> UserRoleIds { get; set; } public ICollection<int> UserRoleIds { get; set; }接受RoleIds。

請按照以下步驟操作:

  1. 使用UserRoleIds定義ViewModel

     public class UserVM { public UserVM() { 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 ICollection<int> RoleIds { get; set; } } 
  2. 剃刀型號

     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"); } } 
  3. 剃刀視圖

     <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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM