【问题标题】:EF Core Insert in many to many tableEF Core 在多对多表中插入
【发布时间】:2019-08-24 20:58:50
【问题描述】:

我用 Razor Pages 搭建了我的用户模型,并在创建页面上我想在联结表 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 表上没有插入任何内容,我不太确定这样做的方法是什么,因为与 Departments 不同,它的 User 没有 UserRoles 的导航属性。

你可以看到关系是正确的

【问题讨论】:

  • 您面临的问题/异常是什么?
  • 更新帖子,异常已解决但没有插入任何内容
  • 似乎在前端您应该将现有用户角色分配给用户,可能创建新用户角色的逻辑在哪里?
  • 它在不同的页面中,模型角色是使用 razor CRUD 搭建的。我知道我可以单独执行此操作,但我认为可以在创建用户时为用户分配角色。已创建角色。
  • 我编辑了这个问题以反映这确实是一个 EF Core 问题而不是 ASP.Net。您需要明确更新角色关系,这不会免费发生。请参阅docs.microsoft.com/en-us/ef/core/saving/related-data 了解更多信息

标签: c# asp.net-core razor-pages ef-core-2.0


【解决方案1】:

对于&lt;select multiple="multiple" asp-for="User.RoleIds" asp-items="Model.RolesOptions" class="form-control form-control-sm"&gt;,它将提交RoleId值而不是Role Object,您需要定义public ICollection&lt;int&gt; 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>
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多