Как я могу добавить роль по умолчанию для нового экземпляра пользователя; - PullRequest
0 голосов
/ 12 марта 2019

Когда пользователь создаст свою учетную запись, он должен получить роль по умолчанию «пользователь», позже я отредактирую пользователя и назначу ему роль администратора или что-то еще. Как мне подойти к этому вопросу. Прямо сейчас я получаю эту ошибку:

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

    }
}

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Я думаю, что ваша проблема в том, что TryUpdateModel() не знает RoleId, который вы пытаетесь присвоить своему доменному объекту, поскольку у вашего представления, вероятно, нет значений для RoleId. Добавление его в Models.User не добавляет его в контекст представления.

Если вы отлаживаете приложение, проверьте, что roleConverted.Id действительно равно 2.

После создания объекта Domain добавьте эти свойства вручную.

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);
}
0 голосов
/ 12 марта 2019

По какой-то причине RoleId, который вы назначаете объекту User, отсутствует в таблице Roles. Вы должны отладить приложение, использовать точку останова прямо перед AddUser и проверить, что содержит RoleId, и проверить, является ли допустимое значение, которое существует в БД в таблице Roles.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...