Search code examples
c#asp.netasp.net-mvcasp.net-mvc-4simplemembership

Add role to user in Simple Membership ASP NET MVC 4


I am using Simplie MemberShip Provider on my ASP NET MVC 4 App. And have some error when i connect user with role. That steps what i do:

1.Add providers on 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. Initialize DB with next code:

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

3. Create user:

membership.CreateUserAndAccount(user, userPassword);

Where membership is SimpleMembershipProvider membership = (SimpleMembershipProvider)Membership.Provider;

  1. Create role:

    roles.CreateRole(userRole);

Where roles is SimpleRoleProvider roles = (SimpleRoleProvider)Roles.Provider;

  1. Try connect User with Role:

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

And on this step i have Exception:

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.

I checked the user and role. They exist. And if i connect them manually, the error does not occur. I'm using MS SQL Server database. Any ideas what is going on here? Maybe need more information to understand this error?

UPD: user, userPassword and userRole is string constants

UPD2: This error occurs if the database contains data. If the database is initially empty, no error occurs in step 5.


Solution

  • I corrected this error.

    First of all check your database schema.

    The columns UserId and RoleId in table webpages_UsersInRoles must ordered like that: First column UserId, Second column RoleId. After check table relationships between webpages_Roles and webpages_Users (this is table that you define for user id, login and another information). They must be correct.

    If you use Code-First Model сheck your model for the correctness of the relationships between these tables.

    For me correct model looks like that:

    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"));
        }
    }