在简单成员资格 ASP NET MVC 4 中向用户添加角色
Add role to user in Simple Membership ASP NET MVC 4
我在 ASP NET MVC 4 应用程序上使用 Simplie MemberShip Provider。当我将用户与角色连接时出现一些错误。
这就是我所做的步骤:
1.Add 供应商 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;
创建角色:
roles.CreateRole(userRole);
其中 roles
是 SimpleRoleProvider roles = (SimpleRoleProvider)Roles.Provider;
尝试连接具有角色的用户:
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 服务器数据库。
知道这里发生了什么吗?可能需要更多信息才能理解此错误?
UPD: user
, userPassword
and userRole
是字符串常量
UPD2:如果数据库包含数据,就会出现这个错误。如果数据库一开始是空的,那么第5步不会出错。
我更正了这个错误。
首先检查您的数据库架构。
table webpages_UsersInRoles
中的 UserId
和 RoleId
列必须这样排序:第一列 UserId
,第二列 RoleId
。检查 webpages_Roles
和 webpages_Users
之间的 table 关系后(这是您为用户 ID、登录和其他信息定义的 table)。他们一定是正确的。
如果您使用 Code-First Model,请检查您的模型以了解这些 table 之间关系的正确性。
对我来说正确的模型是这样的:
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"));
}
}
我在 ASP NET MVC 4 应用程序上使用 Simplie MemberShip Provider。当我将用户与角色连接时出现一些错误。 这就是我所做的步骤:
1.Add 供应商 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;
创建角色:
roles.CreateRole(userRole);
其中 roles
是 SimpleRoleProvider roles = (SimpleRoleProvider)Roles.Provider;
尝试连接具有角色的用户:
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 服务器数据库。 知道这里发生了什么吗?可能需要更多信息才能理解此错误?
UPD: user
, userPassword
and userRole
是字符串常量
UPD2:如果数据库包含数据,就会出现这个错误。如果数据库一开始是空的,那么第5步不会出错。
我更正了这个错误。
首先检查您的数据库架构。
table webpages_UsersInRoles
中的 UserId
和 RoleId
列必须这样排序:第一列 UserId
,第二列 RoleId
。检查 webpages_Roles
和 webpages_Users
之间的 table 关系后(这是您为用户 ID、登录和其他信息定义的 table)。他们一定是正确的。
如果您使用 Code-First Model,请检查您的模型以了解这些 table 之间关系的正确性。
对我来说正确的模型是这样的:
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"));
}
}