c# - 如何为新的用户实例添加默认角色;
问题描述
当用户创建自己的帐户时,他应该获得“用户”的默认角色,稍后我将编辑用户并给他一个管理员角色或其他角色。我应该如何处理这个问题。现在我收到这个错误:
SqlException:INSERT 语句与 FOREIGN KEY 约束“FK__Users__RoleId__38996AB5”冲突。冲突发生在数据库“DormWebApp”、表“dbo.Roles”、列“Id”中。该语句已终止。
我的代码示例
public class Role
{
public int Id { get; set; }
public string Name { get; set; }
public Role()
{
}
}
public ActionResult Create(Models.User user)
{
var roleToAssign = rolesRepository.GetById(2);
Models.Role roleConverted = new Models.Role() { Id = roleToAssign.Id , Name = roleToAssign.Name };
user.RegisterOn = DateTime.Now;
user.Role = roleConverted;
user.RoleId = roleConverted.Id;
if (ModelState.IsValid)
{
if (userServices.ExistingEmailAddress(user.Email))
{
ModelState.AddModelError("Email", "This email address can not be used.");
}
if (userServices.ExistingUsername(user.Username))
{
ModelState.AddModelError("Email", "This username can not be used.");
}
if(!userServices.ExistingUsername(user.Username) && !userServices.ExistingEmailAddress(user.Email))
{
var dbModel = new Domain.Entities.User();
TryUpdateModel(dbModel);
userServices.AddUser(dbModel);
return RedirectToAction("Index");
}
return View(user);
}
return View(user);
public class User
{
public int Id { get; set; }
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
public string LastName { get; set; }
public string Username { get; set; }
[DataType(DataType.Password)]
public string Password { get; set; }
[EmailAddress]
public string Email { get; set; }
public int RoleId { get; set; }
public bool IsActive { get; set; }
public string RoleName { get; set; }
public virtual Role Role { get; set; }
public User()
{
}
}
解决方案
我认为您的问题是TryUpdateModel()
不知道RoleId
您要分配给域实体的内容,因为您的视图可能没有任何 RoleId 值。将其添加到Models.User
不会将其添加到视图上下文。
如果您调试您的应用程序,请检查以确保它roleConverted.Id
实际上等于 2。
构建域对象后,手动添加这些属性。
public ActionResult Create(Models.User user)
{
var roleToAssign = rolesRepository.GetById(2);
Models.Role roleConverted = new Models.Role() { Id = roleToAssign.Id , Name = roleToAssign.Name };
user.RegisterOn = DateTime.Now;
user.Role = roleConverted;
user.RoleId = roleConverted.Id;
if (ModelState.IsValid)
{
if (userServices.ExistingEmailAddress(user.Email))
{
ModelState.AddModelError("Email", "This email address can not be used.");
}
if (userServices.ExistingUsername(user.Username))
{
ModelState.AddModelError("Email", "This username can not be used.");
}
if(!userServices.ExistingUsername(user.Username) && !userServices.ExistingEmailAddress(user.Email))
{
var dbModel = new Domain.Entities.User();
TryUpdateModel(dbModel);
// try this here
dbModel.RoleId = roleConverted.Id;
// you might also need
dbModel.RegisterOn = DateTime.Now;
userServices.AddUser(dbModel);
return RedirectToAction("Index");
}
return View(user);
}
return View(user);
}
推荐阅读
- version - 什么是正确的第一个版本?0.1.0 或 0.0.1 还是其他?
- java - 如何在java中触发静态代码的执行?
- postgresql - PostgreSQL:从多行中选择结果,汇总结果并返回单行
- apache-servicemix - 服务组合更新网页
- php - AJAX 表单提交仅适用于第一次提交
- html - Bootstrap 4:在自定义 div 内的容器内垂直居中内容
- c++ - make_pair 和花括号 { } 在 C++ 中分配一对的区别?
- javascript - 如何在 Angular 中使用使用 commonjs、browserify 和 gulp 创建的消费节点包
- flutter - 如何使小部件与父级匹配但也具有最大宽度?
- python - 停止递归函数 Python