Добавление нескольких пользователей создает несколько ролей - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть это решение для ввода отдельных пользователей в мое приложение, но теперь нам нужно включить всех (более 2k) наших пользователей, у меня есть следующий код, который создает одного пользователя из модели. Однопользовательская запись.

РАБОТАЕТ БОЛЬШОЙ ДЛЯ ОДНОГО ПОЛЬЗОВАТЕЛЯ.

public interface ICreateUser
    {
        void Create(CreateUserModel model);
    }

    public class CreateUser : ICreateUser
    {
        private readonly IUserManagementService _userManagementService;
        private readonly IRoleService _roleService;
        private readonly IAuthorisationService _authorisationService;
        private readonly IPasswordManagementService _passwordManagementService;

        public CreateUser(IUserManagementService userManagementService, IRoleService roleService,
            IAuthorisationService authorisationService, IPasswordManagementService passwordManagementService)
        {
            _userManagementService = userManagementService;
            _roleService = roleService;
            _authorisationService = authorisationService;
            _passwordManagementService = passwordManagementService;
        }

        public void Create(CreateUserModel model)
        {
            var user = new User
            {
                Email = model.AdminEmail,
                FirstName = newUser.FirstName,
                LastName = newUser.LastName,
                IsActive = true
            };
            _passwordManagementService.SetPassword(user, model.AdminPassword, model.ConfirmPassword);

            _userManagementService.AddUser(user);
            CurrentRequestData.CurrentUser = user;

            var memberUserRole = new UserRole
            {
                Name = UserRole.Member
            };

            user.Roles = new HashSet<UserRole> { memberUserRole };
            memberUserRole.Users = new HashSet<User> { user };

            _roleService.SaveRole(memberUserRole);
            _authorisationService.Logout();
            _authorisationService.SetAuthCookie(user, true);
        }
    }

Моя попытка изменить это, чтобы добавить нескольких пользователей, окончилась неудачей, я использовал приведенный ниже список пользователей в качестве примера, но в будущем буду отбирать пользователей из электронной таблицы. Ниже приведен пример цикла foreach для каждого пользователя, который создал новую роль для каждого пользователя. Не очень хорошо, поскольку я рад, что работаю с базой данных dev.

РАБОТАЕТ ДЛЯ ДОБАВЛЕНИЯ НЕСКОЛЬКИХ ПОЛЬЗОВАТЕЛЕЙ, НО ДОБАВЛЯЕТ РОЛЬ ДЛЯ КАЖДОГО ПОЛЬЗОВАТЕЛЯ

public void Create()
    {
        IList<NewUser> newUserList = new List<NewUser>() {
                    new NewUser(){ Email = "Someuser@yahoo.com", FirstName = "Some", LastName = "User", Password = "Password", PasswordConfirm = "Password" },
                    new NewUser(){ Email = "Someuser@eaglemg.com", FirstName = "Some", LastName = "User", Password = "Password", PasswordConfirm = "Password" },
                    new NewUser(){ Email = "Someuser@aol.com", FirstName = "Some", LastName = "User", Password = "Password", PasswordConfirm = "Password" },
                    new NewUser(){ Email = "Someuser@hotmail.com", FirstName = "Some", LastName = "User", Password = "Password", PasswordConfirm = "Password" },
                    new NewUser(){ Email = "Someuser@comcast.net", FirstName = "Some", LastName = "User", Password = "Password", PasswordConfirm = "Password" },
                    new NewUser(){ Email = "Someuser@aol.com", FirstName = "Some", LastName = "User", Password = "Password", PasswordConfirm = "Password" },
                    new NewUser(){ Email = "Someuser@verizon.net", FirstName = "Some", LastName = "User", Password = "Password", PasswordConfirm = "Password" }
        };

        foreach (NewUser newUser in newUserList)
        {
            var user = new User
            {
                Email = newUser.Email,
                FirstName = newUser.FirstName,
                LastName = newUser.LastName,
                IsActive = true
            };
            _passwordManagementService.SetPassword(user, newUser.Password, newUser.PasswordConfirm);

            _userManagementService.AddUser(user);
            CurrentRequestData.CurrentUser = user;

            var memberUserRole = new UserRole
            {
                Name = UserRole.Member
            };

            user.Roles = new HashSet<UserRole> { memberUserRole };
            memberUserRole.Users = new HashSet<User> { user };

            _roleService.SaveRole(memberUserRole);

            _authorisationService.Logout();
            _authorisationService.SetAuthCookie(user, true);
        }
    }

Моя следующая попытка заключается в том, что у меня возникают проблемы, и я не могу понять код для обновления пользователя существующей ролью после создания, см. Ниже.

foreach (NewUser newUser in newUserList)
        {
            var user = new User
            {
                Email = newUser.Email,
                FirstName = newUser.FirstName,
                LastName = newUser.LastName,
                IsActive = true
            };
            _passwordManagementService.SetPassword(user, newUser.Password, newUser.PasswordConfirm);

            _userManagementService.AddUser(user);
            CurrentRequestData.CurrentUser = user;

        }
        var roleName = "Member";
        if (_roleService.GetRoleByName(roleName) != null)
        {
//NEED HELP HERE

            var umpireUserRole = new UserRole
            {
                Name = UserRole.Umpire
            };

            user.Roles = new HashSet<UserRole> { umpireUserRole };
            umpireUserRole.Users = new HashSet<User> { user };
            _roleService.SaveRole(umpireUserRole);

//END OF NEED HELP


        }
        else
        {
            var umpireUserRole = new UserRole
            {
                Name = UserRole.Umpire
            };

            user.Roles = new HashSet<UserRole> { umpireUserRole };
            umpireUserRole.Users = new HashSet<User> { user };

            _roleService.SaveRole(umpireUserRole);

        }

Как видите, я немного смущен, любая помощь будет принята с благодарностью.

Заранее спасибо

1 Ответ

1 голос
/ 17 апреля 2019

Вы создаете новый экземпляр для существующей роли, а это значит, что NHibernate будет рассматривать его как новый объект.Вместо этого вы должны повторно использовать загруженный объект:

var umpireUserRole = 
    _roleService.GetRoleByName(roleName) 
    ?? new UserRole
        {
            Name = UserRole.Umpire,
            Users = new HashSet<User>()
        };

umpireUserRole.Users.Add(user);
user.Roles = new HashSet<UserRole> { umpireUserRole };

_roleService.SaveRole(umpireUserRole);

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