Я создал свою модель пользователя с помощью 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>
Я не совсем уверен, как я могу это сделать, конечно, здесь я получаю исключение, но как я могу связать UserRoles, если это коллекция в User ?
РЕДАКТИРОВАТЬ
Я решил проблему исключения, она была связана со свойствами модели. Теперь проблема в том, что в таблицу UserRoles ничего не вставляется, я не совсем уверен, как это сделать, поскольку у пользователя нет свойства навигации для UserRoles, в отличие от отделов.
как видите отношения правильные
Обновленный пост, исключение устранено, но ничего не вставлено
кажется, что во внешнем интерфейсе вы должны назначать существующие роли пользователей пользователю, где логика, которая может создавать новые роли пользователей?
Это на другой странице, роль модели была создана с использованием Razor CRUD. Я знаю, что мог бы сделать это отдельно, но я думал, что можно назначить роль пользователю при создании пользователя. Есть уже созданные роли.
так что, в этом звонке роли будут просто назначены пользователю? Вы просмотрели вставленные данные в БД, чтобы проверить, правильно ли назначены роли, и если у вас возникли проблемы при создании UserRole, возможно, вы можете поделиться этим кодом
это цель, вставьте идентификатор пользователя и идентификатор роли в соединительную таблицу. но ничего не вставляется. Я думаю, что мне нужно связать его с моделью как массив и вставить первый индекс, но я не уверен
SelectListItem заполняется, имеет ли это значение primary key?
Правильно, вы можете видеть в коде на странице Метод Get, также добавлено изображение отношений, они верны
Я отредактировал вопрос, чтобы отразить, что это действительно вопрос EF Core, а не ASP.Net. Вам необходимо явно обновить ролевые отношения, это не произойдет бесплатно. См. docs.microsoft.com/en-us/ef/core/saving/related-data для получения дополнительной информации.





Для <select multiple = "multiple" asp-for = "User.RoleIds" asp-items = "Model.RolesOptions" class = "form-control form-control-sm"> он будет отправлять значение RoleId вместо объекта роли, вам нужно определить public ICollection<int> UserRoleIds { get; set; }, чтобы принимать RoleId.
Выполните следующие действия:
Определите ViewModel с помощью UserRoleIds
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; }
}
Модель бритвы
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>
с какой проблемой/исключением вы столкнулись?