在Simple Membership ASP NET MVC 4中为用户添加角色

问题描述 投票:0回答:1

我在我的ASP NET MVC 4 App上使用Simplie MemberShip Provider。当我将用户与角色连接时出现一些错误。这就是我所做的:

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.使用下一个代码初始化DB:

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

3.创建用户:

membership.CreateUserAndAccount(user, userPassword);

membershipSimpleMembershipProvider membership = (SimpleMembershipProvider)Membership.Provider;

  1. 创建角色: roles.CreateRole(userRole);

rolesSimpleRoleProvider 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:useruserPassworduserRole是字符串常量

UPD2:如果数据库包含数据,则会发生此错误。如果数据库最初为空,则在步骤5中不会发生错误。

c# asp.net asp.net-mvc asp.net-mvc-4 simplemembership
1个回答
0
投票

我纠正了这个错误。

首先检查您的数据库架构。

UserId中的RoleIdwebpages_UsersInRoles列必须按如下顺序排列:第一列UserId,第二列RoleId。检查webpages_Roleswebpages_Users之间的表关系后(这是您为用户ID,登录和其他信息定义的表)。他们必须是正确的。

如果您使用Code-First Model,请检查您的模型,以确定这些表之间关系的正确性。

对我来说正确的模型看起来像这样:

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"));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.