首页 > 解决方案 > 如何为新的用户实例添加默认角色;

问题描述

当用户创建自己的帐户时,他应该获得“用户”的默认角色,稍后我将编辑用户并给他一个管理员角色或其他角色。我应该如何处理这个问题。现在我收到这个错误:

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()
    {

    }
}

标签: c#asp.netasp.net-mvc

解决方案


我认为您的问题是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);
}

推荐阅读