实体类型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
是正确的,因为我以前使用过它。
使用带有ASP.NET Identity的自定义用户类时,必须确保在实例化时将自定义用户类类型<T>
显式指定为UserManager
和UserStore
。
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
。
以下是我在解决此问题时发现的一些步骤
- 首先检查数据库中的ASP.Net标识表
- 在数据库上创建这些表,如果不存在,也可以应用迁移
- 检查下图并验证您的代码
注册操作
IdentityDbContext类