EF Core 插入多对多 table
EF Core Insert in many to many table
我用 Razor Pages 构建了我的用户模型,在创建页面上我想在连接处插入用户角色 table 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 table 上没有插入任何内容,我不太确定这样做的方法是什么,因为与 Departments 不同,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; }
接受RoleIds。
按照以下步骤操作:
用 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; }
}
剃须刀型号
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");
}
}
Razor 视图
<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 Pages 构建了我的用户模型,在创建页面上我想在连接处插入用户角色 table 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 table 上没有插入任何内容,我不太确定这样做的方法是什么,因为与 Departments 不同,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; }
接受RoleIds。
按照以下步骤操作:
用
定义一个 ViewModelUserRoleIds
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"); } }
Razor 视图
<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>