简体   繁体   English

在简单成员身份ASP NET MVC 4中向用户添加角色

[英]Add role to user in Simple Membership ASP NET MVC 4

I am using Simplie MemberShip Provider on my ASP NET MVC 4 App. 我在ASP NET MVC 4应用程序上使用Simplie MemberShip Provider。 And have some error when i connect user with role. 当我将用户与角色连接时会出现一些错误。 That steps what i do: 那一步我做什么:

1.Add providers on web.config: 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. Initialize DB with next code: 2.用下面的代码初始化数据库:

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

3. Create user: 3.创建用户:

membership.CreateUserAndAccount(user, userPassword);

Where membership is SimpleMembershipProvider membership = (SimpleMembershipProvider)Membership.Provider; 其中membershipSimpleMembershipProvider membership = (SimpleMembershipProvider)Membership.Provider;

  1. Create role: 创建角色:

    roles.CreateRole(userRole);

Where roles is SimpleRoleProvider roles = (SimpleRoleProvider)Roles.Provider; 其中rolesSimpleRoleProvider 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 . 我正在使用MS SQL Server数据库 Any ideas what is going on here? 有什么想法吗? Maybe need more information to understand this error? 也许需要更多信息来了解此错误?

UPD : user , userPassword and userRole is string constants UPDuseruserPassworduserRole是字符串常量

UPD2 : This error occurs if the database contains data. UPD2 :如果数据库包含数据,则会发生此错误。 If the database is initially empty, no error occurs in step 5. 如果数据库最初为空,则在步骤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 . webpages_UsersInRoles UserIdRoleId列必须按以下顺序排序: 第一列UserId ,第二列RoleId After check table relationships between webpages_Roles and webpages_Users (this is table that you define for user id, login and another information). 在检查了webpages_Roleswebpages_Users之间的表关系之后(这是您为用户ID,登录名和其他信息定义的表)。 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"));
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM