2013-10-11 2 views
1

Я создаю некоторые данные в методе семян. Я создаю несколько пользователей с несколькими разрешениями (роли)Roles.AddUserToRole находит разные userId с одинаковым именем пользователя

WebSecurity.InitializeDatabaseConnection("MibContext", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
Roles.CreateRole(Constants.Roles.Administrator); 
Roles.CreateRole(Constants.Roles.ContentManager); 
Roles.CreateRole(Constants.Roles.KeyAccountManager); 

Я тогда переменный для пользователя (чтобы избежать опечаток возможности)

var adminusername = "[email protected]"; 
var userusername = "[email protected]"; 

Я создаю запись Userprofile через EF а UnitOfWork Pattern

var admin = new UserProfile 
     { 
      FirstName = "Admin", 
      LastName = "Account", 
      UserName = adminusername 
     }; 
unitOfWork.UserRepository.Insert(admin); 
unitOfWork.Save(); 

Затем создать пользователя членства учетной записи, а также назначить роли:

WebSecurity.CreateAccount(adminusername, "123456"); 
WebSecurity.CreateAccount(userusername, "123456"); 

Roles.AddUserToRole(userusername, Constants.Roles.Administrator); 
Roles.AddUserToRole(userusername, Constants.Roles.KeyAccountManager); 

Последняя команда команд вызывает ошибку, Нарушение внешнего ключа между UsersInRoles и UserProfile. Это очень странно, поскольку он может сопоставить роль первому пользователю (который впервые был пользователем admin, но хотел посмотреть, может ли он создать разрешение для этого пользователя, что он делает)

Затем я удалил ограничение внешнего ключа, чтобы увидеть, что происходит, и на нем помещено 3. Тестирование, повторяя, но добавляя четвертую роль, кажется, что параметры (имя пользователя, роли) неверны!!!? Новая роль имеет Id = 4 и повторение теста, то есть то, что она помещает в столбец UserId.

RoleId UserId 
2  1 
2  4 
NULL  NULL 

Роли настроены:

<roleManager enabled="true" defaultProvider="SimpleRoleProvider"> 
    <providers> 
    <clear/> 
    <add name="SimpleRoleProvider" 
     type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" /> 
    </providers> 
</roleManager> 

ли я что-то отсутствует?

+0

Профилирование SQL показывает следующую команду: INSERT INTO webpages_UsersInRoles VALUES (4,1); Какой порядок я помещаю в метод, но таблица создается с помощью ROLE сначала, а не пользователя. Если бы они ввели имена полей, все было бы хорошо. – Simon

+0

Приятно, что вы оставили этот вопрос здесь и ответили на него. Я после 4 часов охоты за то, почему AddUserToRole будет бросать ключевое нарушение. Было бы неплохо, если бы вы могли обновить заголовок вопроса с нарушением ключа, потому что это то, что я сначала ищу, например, как «AddUsersToRole бросает исключение нарушения правил» или что-то в этом роде? – Mateusz

ответ

1

Порядок полей в таблице webpages_UsersInRole, очевидно, очень важен.

Я посмотрел на карту, чтобы увидеть, что там было, и отношения (многие -> многие) были определены на стороне таблицы ROLES. Я поменял отображение на сторону пользователей, и теперь он работает правильно. Вот сопоставление, которое я использовал в объекте UserProfile.

// Relationships 
     this.HasMany(t => t.webpages_Roles) 
      .WithMany(t => t.UserProfiles) 
      .Map(m => 
      { 
       m.ToTable("webpages_UsersInRoles"); 
       m.MapRightKey("RoleId"); 
       m.MapLeftKey("UserId"); 
      }); 

Действительно, Поставщик роли не должен брать на себя порядок столбцов и должен указывать их имена. По крайней мере, я все еще могу использовать функциональность по умолчанию, изменяя таким образом отображение. Это довольно беден SQL:

INSERT INTO webpages_UsersInRoles VALUES (4,1); 
Смежные вопросы