C#asp.net身份和自定义角色 [英] c# asp.net identity and custom roles

查看:105
本文介绍了C#asp.net身份和自定义角色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我认为我在这里做些愚蠢的事情。
我使用了具有asp.net身份的代码优先实体框架,并建立了这样的自定义用户:

 公共类User: IdentityUser,IKey< string> 
{
[MaxLength(100)]公共字符串JobTitle {get;组; }
[MaxLength(100)]公共字符串Image {get;组; }
[MaxLength(100)]公共字符串FirstName {get;组; }
[MaxLength(100)]公共字符串LastName {get;组; }
}

然后我将 DbContext 更新为匹配:

 受保护的覆盖无效OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
//自定义ASP.NET身份模型,并在需要时覆盖默认值。
//例如,您可以重命名ASP.NET标识表名称和更多名称。
//调用base.OnModelCreating(builder);后添加自定义项

builder.Entity< User>(m => m.ToTable( Users)));
builder.Entity< IdentityRole>(m => m.ToTable( Roles)));
builder.Entity< IdentityRoleClaim< string>(m => m.ToTable( RoleClaims));
builder.Entity< IdentityUserClaim< string>(m => m.ToTable( UserClaims));
builder.Entity< IdentityUserLogin< string>((m => m.ToTable( UserLogins)));
builder.Entity< IdentityUserRole< string>((m => m.ToTable( UserRoles)));
builder.Entity< IdentityUserToken< string>>(m => m.ToTable( UserTokens)));
}

所有工作正常,并且表已成功创建。
现在我想对角色做同样的事情,除了这次我不需要多余的列(在这里重要的是界面),所以我创建了一个新的 Role 类:

 公共类作用:IdentityRole,IKey< string> 
{
}

然后我更改了 OnModelCreating 方法:

 受保护的覆盖无效OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder) ;
//自定义ASP.NET身份模型,并在需要时覆盖默认值。
//例如,您可以重命名ASP.NET标识表名称和更多名称。
//调用base.OnModelCreating(builder);后添加自定义项

builder.Entity< User>(m => m.ToTable( Users)));
builder.Entity< Role>(m => m.ToTable( Roles)));
builder.Entity< IdentityRoleClaim< string>(m => m.ToTable( RoleClaims));
builder.Entity< IdentityUserClaim< string>(m => m.ToTable( UserClaims));
builder.Entity< IdentityUserLogin< string>((m => m.ToTable( UserLogins)));
builder.Entity< IdentityUserRole< string>((m => m.ToTable( UserRoles)));
builder.Entity< IdentityUserToken< string>>(m => m.ToTable( UserTokens)));
}

唯一更改的行是 builder.Entity< Role>(m => m.ToTable( Roles));
当我运行 add-migration RoleChange 时,我期望自上次迁移以来没有任何变化,但我却收到此错误:


实体类型'Role'不能映射到表,因为它是从'IdentityRole'派生的。只有基本实体类型可以映射到表。


有人知道为什么吗?
我不明白为什么 User 可以工作,但是 Role 不会。 p>



这里是完整上下文:

 公共类DatabaseContext:IdentityDbContext< User> ; 
{
public DbSet< Claim>要求{组; }

///< summary>
///仅用于测试
///< / summary>
public DatabaseContext()
{

}

// ReSharper禁用一次ModifySimpleBaseTypeForParameter
public DatabaseContext(DbContextOptions< DatabaseContext> options)
:base(options)
{
}

受保护的覆盖无效OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
//自定义ASP.NET身份模型,并在需要时覆盖默认值。
//例如,您可以重命名ASP.NET标识表名称和更多名称。
//调用base.OnModelCreating(builder);后添加自定义项

builder.Entity< User>(m => m.ToTable( Users)));
builder.Entity< Role>(m => m.ToTable( Roles)));
builder.Entity< IdentityRoleClaim< string>(m => m.ToTable( RoleClaims));
builder.Entity< IdentityUserClaim< string>(m => m.ToTable( UserClaims));
builder.Entity< IdentityUserLogin< string>((m => m.ToTable( UserLogins)));
builder.Entity< IdentityUserRole< string>((m => m.ToTable( UserRoles)));
builder.Entity< IdentityUserToken< string>>(m => m.ToTable( UserTokens)));
}
}


解决方案

您所做的操作是正确的,只需更新此行

 公共类DatabaseContext:IdentityDbContext< User> 

如下:

 公共类DatabaseContext:IdentityDbContext<用户,角色,字符串> 


I think I am just doing something silly here. I have used code first entity framework with asp.net identity and I set up a custom user like this:

public class User : IdentityUser, IKey<string>
{
    [MaxLength(100)] public string JobTitle { get; set; }
    [MaxLength(100)] public string Image { get; set; }
    [MaxLength(100)] public string FirstName { get; set; }
    [MaxLength(100)] public string LastName { get; set; }
}

then I updated my DbContext to match:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    // Customize the ASP.NET Identity model and override the defaults if needed.
    // For example, you can rename the ASP.NET Identity table names and more.
    // Add your customizations after calling base.OnModelCreating(builder);

    builder.Entity<User>(m => m.ToTable("Users"));
    builder.Entity<IdentityRole>(m => m.ToTable("Roles"));
    builder.Entity<IdentityRoleClaim<string>>(m => m.ToTable("RoleClaims"));
    builder.Entity<IdentityUserClaim<string>>(m => m.ToTable("UserClaims"));
    builder.Entity<IdentityUserLogin<string>>(m => m.ToTable("UserLogins"));
    builder.Entity<IdentityUserRole<string>>(m => m.ToTable("UserRoles"));
    builder.Entity<IdentityUserToken<string>>(m => m.ToTable("UserTokens"));
}

All works, and the tables were created successfully. Now I want to do the same for roles, except this time I don't need extra columns (it's the interface that is important here) so I create a new Role class:

public class Role: IdentityRole, IKey<string>
{
}

I then changed my OnModelCreating method to this:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    // Customize the ASP.NET Identity model and override the defaults if needed.
    // For example, you can rename the ASP.NET Identity table names and more.
    // Add your customizations after calling base.OnModelCreating(builder);

    builder.Entity<User>(m => m.ToTable("Users"));
    builder.Entity<Role>(m => m.ToTable("Roles"));
    builder.Entity<IdentityRoleClaim<string>>(m => m.ToTable("RoleClaims"));
    builder.Entity<IdentityUserClaim<string>>(m => m.ToTable("UserClaims"));
    builder.Entity<IdentityUserLogin<string>>(m => m.ToTable("UserLogins"));
    builder.Entity<IdentityUserRole<string>>(m => m.ToTable("UserRoles"));
    builder.Entity<IdentityUserToken<string>>(m => m.ToTable("UserTokens"));
}

The only line that changed was builder.Entity<Role>(m => m.ToTable("Roles"));. When I run add-migration RoleChange I expected nothing to have changed since my last migration, but instead I get this error:

The entity type 'Role' cannot be mapped to a table because it is derived from 'IdentityRole'. Only base entity types can be mapped to a table.

Does anyone know why? I don't understand why User works, but Role won't....


Here is the full context:

public class DatabaseContext : IdentityDbContext<User>
{
    public DbSet<Claim> Claims { get; set; }

    /// <summary>
    /// For testing only
    /// </summary>
    public DatabaseContext()
    {

    }

    // ReSharper disable once SuggestBaseTypeForParameter
    public DatabaseContext(DbContextOptions<DatabaseContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);

        builder.Entity<User>(m => m.ToTable("Users"));
        builder.Entity<Role>(m => m.ToTable("Roles"));
        builder.Entity<IdentityRoleClaim<string>>(m => m.ToTable("RoleClaims"));
        builder.Entity<IdentityUserClaim<string>>(m => m.ToTable("UserClaims"));
        builder.Entity<IdentityUserLogin<string>>(m => m.ToTable("UserLogins"));
        builder.Entity<IdentityUserRole<string>>(m => m.ToTable("UserRoles"));
        builder.Entity<IdentityUserToken<string>>(m => m.ToTable("UserTokens"));
    }
}

解决方案

What you have done is correct, you just need to update this line

public class DatabaseContext : IdentityDbContext<User>

as below :

public class DatabaseContext : IdentityDbContext<User, Role, string>

这篇关于C#asp.net身份和自定义角色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆