我正在为用户创建配置文件,向 ApplicationUser 添加列,然后在 ApplicationDbContext 中执行 DbSet 命令。仅仅编写 DbSet 命令,就会抛出错误:
InvalidOperationException:无法具体化实体实例 输入“身份用户”。没有与鉴别器值匹配的鉴别器 ”。
我做错了什么,哪里做错了?我该如何修复它?只需将 DbSet 放到 ApplicationDbContex 中,一切就可以正常运行。
应用程序用户代码:
public class ApplicationUser : IdentityUser
{
[Display(Name = "Full Name")] public string FullName { get; set; }
public DateTime CreateAt { get; set; }
public DateTime? UpdateAt { get; set; }
public string ImagePath { get; set; }
public ApplicationUser()
{
CreateAt = DateTime.Now;
UpdateAt = DateTime.Now;
}
}
应用程序DbConText:
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
}
您似乎缺少
ApplicationUser
作为您上下文的通用参数。
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
查看更多详细信息:自定义身份模型
我不知道这是否有帮助。在数据库中创建测试用户后,我刚刚尝试为 IdentityUsers 创建扩展表;遇到了这个错误,当我检查数据库时,它向 IdentityUser 表添加了一个 Discriminator 属性。因此,对于我的测试用户,我将“IdentityUser”作为鉴别器,它加载页面的效果非常好。这可能是因为该用户已登录,并且无法加载默认的未登录页面,但我想我会把它扔在那里。
我的假设是它正在尝试加载用户,但它不知道如何处理空白鉴别器点,并且它不会为以前创建的用户分配默认鉴别器值。
我也面临这个例外。要解决此问题,只需转到数据库打开包含“鉴别器”列的表并删除记录并运行应用程序即可。其余的事情由实体框架处理。我希望这也对您有用。
在您的 Startup.cs 或 Program.cs 中(这取决于您是否 使用 ASP.NET Core 6.x 或更早版本)。
更改此:
builder.Services.AddDefaultIdentity<IdentityUser>
对此:
builder.Services.AddDefaultIdentity<ApplicationUser>
不要忘记。除了在您的
Shared/_LoginPartial.cshtml
: 中进行修改之外
那些:
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
致那些人:
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
注册时检查电子邮件是否唯一,示例
var emailAlreadyUsed = _userManager.Users.Any(x => x.Email == user.Email);
if (emailAlreadyUsed){
ModelState.AddModelError(string.Empty, "Email already used");
return Page();
}
var result = await _userManager.CreateAsync(user, Input.Password);
讨论确实很老了,但我也犯了同样的错误,我发现讨论让我走上了正路,但需要更多的研究来找到我的问题的解决方案,我只会解释我解决问题的方法。
当您将自己的用户类添加到项目中时,用户类通常会重命名为
ApplicationUser
,一个继承IdentityUser
的类,在进行任何迁移之前,您必须进入ApplicationDbContext
文件并添加它作为上下文的通用参数:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
之后,您必须在更改这些行时始终在
_LoginPartial.cshtml
文件 (Views > Shared > _LoginPartial.cshtml
) 中进行一些更改:
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
通过那些
@using Microsoft.AspNetCore.Identity
@using YourProjectName.Data
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
不要忘记将 YourProjectName 替换为您的项目名称
之后,您必须进入
Program.cs
文件并替换第 IdentityUser
行中的 13
:
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
用
IdentityUser
引用替换对 ApplicationUser
的引用,它应该看起来像这样 :
builder.Services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
如果您的项目中有一个
Startup.cs
文件,您应该在第 41
行进行一些更改,您会发现以下行:
services.AddDefaultIdentity<IdentityUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
将指令替换为以下内容:
services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
options.User.RequireUniqueEmail = false;
})
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
不要忘记删除我在此处粘贴的一些说明之间的空格。
更多详细信息请参阅课程和ASP.NET Core 文档
我写的已经写好了,在这里或其他讨论中,我只是试图将所有这些答案放在一起并尝试添加一些精度,@feihoa给出的链接确实对我有帮助。希望我的回答对大家有帮助。
问候。