有没有一种方法可以创建自定义用户和角色,而无需在
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 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 的字符串
看来答案是“否”。如果您在
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 错误?
您可以通过将 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")
{