有没有一种方法可以创建自定义用户和角色,而无需在 IdenitityUser、IdentityRole 和 IdentityDbContext 上指定 TKey?

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

有没有一种方法可以创建自定义用户和角色,而无需在

string
IdentityUser
IdentityRole
中指定 TKey
IdentityDbContext
?我问这个问题是因为它似乎认为我不再需要自动生成的主键
Id
,而我绝对需要。按照我在下面所做的操作,
UserManager.Create(user, password)
将失败,并在
EntityValidationError
上显示
Id

public class ApplicationUser : IdentityUser<string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    [Required]
    [StringLength(50)]
    public string FirstName { get; set; }

    [Required]
    [StringLength(50)]
    public string LastName { get; set; }
}

public class ApplicationUserLogin : IdentityUserLogin
{
}

public class ApplicationUserClaim : IdentityUserClaim
{
}

public class ApplicationUserRole : IdentityUserRole
{
}

public class ApplicationRole : IdentityRole<string, ApplicationUserRole>
{
    [Required]
    [StringLength(50)]
    public string ProperName { get; set; }

    [Required]
    public string Description { get; set; }
}


public class MyAppDb : IdentityDbContext<ApplicationUser, ApplicationRole, string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    public MyAppDb()
        : base("MyAppDb")
    {
    }

    public static MyAppDb Create()
    {
        return new MyAppDb();
    }
}
asp.net asp.net-mvc entity-framework asp.net-mvc-5 asp.net-identity
3个回答
0
投票

我仍在学习这个新的 ASP.NET Identity 系统,但您是否尝试过省略这样的泛型类型:

public class ApplicationUser : IdentityUser
{
    [Required]
    [StringLength(50)]
    public string FirstName { get; set; }

    [Required]
    [StringLength(50)]
    public string LastName { get; set; }
}

同样适用于

ApplicationRole

MyAppDb
看起来像这样:

public class MyAppDb: IdentityDbContext<ApplicationUser>

默认情况下,ID 将是数据库中自动生成的 GUID 的字符串


0
投票

看来答案是“否”。如果您在

User
和/或
Role
上指定 TKey,则不再为您创建主键。

我似乎试图让事情变得过于复杂。感谢@dima 帮助我决定让事情变得简单。以下是我成功让用户和角色(均具有自定义属性)成功工作的方法,即通过控制器和视图在数据库中成功创建记录:

更新:您可能想查看我在底部提供的链接以获得更好/更简单的解决方案。

public class ApplicationUser : IdentityUser
{
    [Required]
    [StringLength(50)]
    public string FirstName { get; set; }

    [Required]
    [StringLength(50)]
    public string LastName { get; set; }
}

//public class ApplicationUserLogin : IdentityUserLogin
//{
//}

//public class ApplicationUserClaim : IdentityUserClaim
//{
//}

//public class ApplicationUserRole : IdentityUserRole
//{
//}

public class ApplicationRole : IdentityRole
{
    [Required]
    [StringLength(50)]
    public string ProperName { get; set; }
}


public class MyAppDb : IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>
{
    public MyAppDb()
        : base("MyAppDb")
    {
    }
}

然而,

UserManager
又出现了一个新问题。具体来说,我在这行代码上收到错误
The entity type IdentityRole is not part of the model for the current context.
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

更新:在这里修复了此错误:为什么我收到 IdentityRole 错误?


0
投票

您可以通过将 Id 属性添加到 ApplicationUser 和 ApplicationRole 中并使用其 Identity 属性来自动生成 ID,如下所示:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public override string Id { get; set; }

此外,至少从 .NET8 开始,EFCore Identity 不再要求您在 IdentityDbContext 中包含所有身份类型。您可以停在 TKey 类型参数处 (

string
)。

public class MyAppDb : IdentityDbContext<ApplicationUser, ApplicationRole, string>
{
    public MyAppDb() : base("MyAppDb")
{
© www.soinside.com 2019 - 2024. All rights reserved.