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;
Create role:
roles.CreateRole(userRole);
Where roles
is SimpleRoleProvider roles = (SimpleRoleProvider)Roles.Provider;
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.
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"));
}
}