Добавить роль пользователю в простом членстве ASP NET MVC 4 - PullRequest
0 голосов
/ 03 сентября 2018

Я использую Simplie MemberShip Provider в своем приложении ASP NET MVC 4. И есть некоторые ошибки, когда я подключаю пользователя с ролью. Вот шаги, которые я делаю:

1.Добавить провайдеров на web.config:

<roleManager enabled="true" defaultProvider="SimpleRoleProvider">
  <providers>
    <clear />
    <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
  </providers>
</roleManager>
<membership defaultProvider="SimpleMembershipProvider">
  <providers>
    <clear />
    <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
  </providers>
</membership>
<sessionState mode="InProc" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="ContextDataModel" />
  </providers>
</sessionState>

2. Инициализируйте БД следующим кодом:

WebSecurity.InitializeDatabaseConnection("SomeDataBaseModel", "webpages_Users", "Id", "Name", true);

3. Создать пользователя:

membership.CreateUserAndAccount(user, userPassword);

Где membership равно SimpleMembershipProvider membership = (SimpleMembershipProvider)Membership.Provider;

  1. Создать роль:

    roles.CreateRole(userRole);

Где roles равно SimpleRoleProvider roles = (SimpleRoleProvider)Roles.Provider;

  1. Попробуйте подключить пользователя с ролью:

    roles.AddUsersToRoles(new[] { user }, new[] { userRole });

И на этом шаге у меня есть исключение:

The INSERT statement conflicted with the FOREIGN KEY constraint "webpages_Roles_webpages_Users_Source". The conflict occurred in database "SomeDataBase", table "dbo.webpages_Roles", column 'RoleId'.
The statement has been terminated.

Я проверил пользователя и роль. Они существуют. И если я подключаю их вручную, ошибка не возникает. Я использую База данных MS SQL Server . Есть идеи, что здесь происходит? Может быть, нужно больше информации, чтобы понять эту ошибку?

UPD : user, userPassword и userRole - строковые константы

UPD2 : эта ошибка возникает, если база данных содержит данные. Если база данных изначально пуста, на шаге 5 не возникает ошибок.

1 Ответ

0 голосов
/ 05 сентября 2018

Я исправил эту ошибку.

Прежде всего проверьте схему базы данных .

Столбцы UserId и RoleId в таблице webpages_UsersInRoles должны быть упорядочены следующим образом: Первый столбец UserId, Второй столбец RoleId. После проверки связи таблиц между webpages_Roles и webpages_Users (это таблица, которую вы определяете для идентификатора пользователя, имени входа и другой информации). Они должны быть правильными.

Если вы используете Модель с первым кодом , проверьте вашу модель на правильность отношений между этими таблицами.

Для меня правильная модель выглядит так:

public partial class YourContextModel : DbContext
{
    public YourContextModel()
        : base("name=YourDataBaseConnectionString")
    {
    }

    public virtual DbSet<webpages_Membership> webpages_Membership { get; set; }
    public virtual DbSet<webpages_OAuthMembership> webpages_OAuthMembership { get; set; }
    public virtual DbSet<webpages_Roles> webpages_Roles { get; set; }
    public virtual DbSet<webpages_Users> webpages_Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<webpages_Users>()
            .HasOptional(e => e.webpages_Membership)
            .WithRequired(e => e.webpages_Users);

        modelBuilder.Entity<webpages_Users>()
            .HasMany(e => e.webpages_Roles)
            .WithMany(e => e.webpages_Users)
            .Map(m => m.ToTable("webpages_UsersInRoles").MapLeftKey("UserId").MapRightKey("RoleId"));
    }
}
...