.NET Core:“无法具体化‘IdentityUser’类型的实体实例。没有鉴别器与鉴别器值匹配”

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

我正在为用户创建配置文件,向 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; }
}
c# .net asp.net-core dbcontext asp.net-core-5.0
6个回答
6
投票

您似乎缺少

ApplicationUser
作为您上下文的通用参数。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

查看更多详细信息:自定义身份模型


1
投票

我不知道这是否有帮助。在数据库中创建测试用户后,我刚刚尝试为 IdentityUsers 创建扩展表;遇到了这个错误,当我检查数据库时,它向 IdentityUser 表添加了一个 Discriminator 属性。因此,对于我的测试用户,我将“IdentityUser”作为鉴别器,它加载页面的效果非常好。这可能是因为该用户已登录,并且无法加载默认的未登录页面,但我想我会把它扔在那里。

我的假设是它正在尝试加载用户,但它不知道如何处理空白鉴别器点,并且它不会为以前创建的用户分配默认鉴别器值。


1
投票

我也面临这个例外。要解决此问题,只需转到数据库打开包含“鉴别器”列的表并删除记录并运行应用程序即可。其余的事情由实体框架处理。我希望这也对您有用。


0
投票

在您的 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


0
投票

注册时检查电子邮件是否唯一,示例

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);

0
投票

讨论确实很老了,但我也犯了同样的错误,我发现讨论让我走上了正路,但需要更多的研究来找到我的问题的解决方案,我只会解释我解决问题的方法。

当您将自己的用户类添加到项目中时,用户类通常会重命名为

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给出的链接确实对我有帮助。希望我的回答对大家有帮助。

问候。

© www.soinside.com 2019 - 2024. All rights reserved.