实体类型IdentityUser不是当前上下文的模型的一部分

本文关键字:上下文 模型 一部分 类型 IdentityUser 实体 | 更新日期: 2023-09-27 18:25:35

我看到了与这个问题相同的问题,但那里呈现的场景似乎不适用,所以我认为我有一个不同的问题。事实上,我在SO上看到了几个相似的问题,每个问题都有不同的原因和解决方案,所以我认为这个错误一定是从高层引起的。也就是说。。。

我有一个EF代码优先的数据库模型,我正在尝试使用IdentityUser来扩展我的MVC 5站点的标准注册。

我有我的扩展UserModel:

namespace MyMvcSite.Models 
{
    public class UserModel : IdentityUser 
    {
        public string BillingId { get; set; }
        public virtual ICollection<DatabaseModel> Databases { get; set; }
    }
}

我的背景:

using MyMvcSite.Models;
namespace MyMvcSite.Web 
{
    public class AuthContext : IdentityDbContext<UserModel> 
    {
        public AuthContext() : base("AuthContext") { }
    }
}

现在,当我执行代码注册用户时:

public async Task<IdentityResult> RegisterUser(UserModel user) 
{
    user.Email = user.UserName;
    var result = await _userManager.CreateAsync(user);
    
    return result;
}

我得到这个错误:

实体类型IdentityUser不是当前上下文的模型的一部分。

我不明白这个错误是什么意思,因为看起来我什么都对。有人能说出可能出了什么问题吗???

我知道我的connectionStringAuthContext是正确的,因为我以前使用过它。

实体类型IdentityUser不是当前上下文的模型的一部分

使用带有ASP.NET Identity的自定义用户类时,必须确保在实例化时将自定义用户类类型<T>显式指定为UserManagerUserStore

private UserManager<UserModel> _userManager;
public AccountController()
{
    AuthContext _ctx = new AuthContext();
    UserStore<UserModel> userStore = new UserStore<UserModel>(_ctx);
    _userManager = new UserManager<UserModel>(userStore);     
}

或以较短的形式(如您的回复评论):

private UserManager<UserModel> _userManager;
public AccountController()
{
    AuthContext _ctx = new AuthContext();    
    _userManager = new UserManager<UserModel>(new UserStore<UserModel>(_ctx));     
}

如果在您想要使用自定义类时允许类型默认为IdentityUser,您将遇到报告的错误。

我也遇到过同样的问题,我记得在MVC4中使用SimpleMembership时也遇到过类似的问题。

我正在进行数据库优先开发,所以我有一个EDMX文件。事实证明,ASP.NET Identity不喜欢生成.edmx模型文件时创建的连接字符串。如果您在:base中使用EDM连接字符串("EDMConnString"),则很可能会出现此问题。

我通过创建一个标准连接字符串来解决这个问题,该字符串指向ASP.NET标识表所在的数据库(在我的情况下是同一个数据库),并在:base中使用了该连接字符串,它起到了作用。

像这样的

<add name="IdentityConnection" connectionString="data source=THEJUS'SQLSERVER2014;initial catalog=IdentitySample;integrated security=True;MultipleActiveResultSets=True;App=IdentitySample.Admin" providerName="System.Data.SqlClient" />

我在项目中引入DI时遇到了这个错误。使用AutoFac和Identity,我不得不添加以下内容:builder.RegisterType<ApplicationDbContext>().As<DbContext>().InstancePerLifetimeScope();

如果没有这一点,当AutoFac创建我的UserStore实例时,它使用的是默认的UserStore() ctor,它创建了一个新的IdentityDbContext,而不是我的ApplicationDbContext

通过这一行,调用了UserStore(DbContext context)ctor和我的ApplicationDbContext

以下是我在解决此问题时发现的一些步骤

  1. 首先检查数据库中的ASP.Net标识表
  2. 在数据库上创建这些表,如果不存在,也可以应用迁移
  3. 检查下图并验证您的代码

注册操作

IdentityDbContext类

相关文章: