我有一个.NET Core 2.1应用程序,正在尝试手动将用户添加到角色中。
我不使用角色管理器,因为我正在使用的数据库也可以通过传统的ASP.NET MVC应用程序访问。
我有以下代码来更新用户:
public async Task<bool> Update(UserFormViewModel model)
{
var user = await GetUserById(model.Id);
_context.Entry(user).Property(x => x.Id).IsModified = false;
_context.Entry(user).CurrentValues.SetValues(model);
user.AspNetUserRoles.Clear();
await _context.SaveChangesAsync();
foreach (var role in model.Roles)
{
var aspnetuserrole = await _context.AspNetUserRoles.Where(x => x.RoleId == role).Include(x=>x.Role).Include(x=>x.User).FirstOrDefaultAsync();
user.AspNetUserRoles.Add(aspnetuserrole);
}
try
{
var result = await _context.SaveChangesAsync() > 0;
return result;
}
catch (Exception ex)
{
return false;
}
}
此代码因错误而失败:
“实体类型'AspNetUserRole'的属性'UserId'是 键,因此无法修改或标记为已修改。
这些是我的模特:
这是我提交的ViewModel:
public class UserFormViewModel
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string[] Roles { get; set; }
}
这是我的App用户模型:
public class ApplicationUser : IdentityUser
{
[Required]
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<AspNetUserRole> AspNetUserRoles { get; set; }
}
public class AspNetUserRole
{
public string UserId { get; set; }
public ApplicationUser User {get; set;}
public string RoleId { get; set; }
public AspNetRole Role {get; set;}
}
public class AspNetRole
{
[Key]
public string Id { get; set; }
[MaxLength(256)]
[Required]
public string Name {get; set;}
public virtual ICollection<AspNetUserRole> AspNetUserRoles {get; set;}
}
答案 0 :(得分:1)
尝试一下:
foreach (var role in model.Roles)
{
var aspnetuserrole = new AspNetUserRoles()
{
UserId = model.Id,
RoleId = role.Id
};
_context.AspNetUserRoles.Add(aspnetuserrole);
}