我看到与this问题相同的问题,但那里提出的情况似乎并不适用,所以我认为我有一个不同的问题。事实上,我在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;
}
我收到错误:The entity type IdentityUser is not part of the model for the current context.
我无法弄清楚这个错误意味着什么,因为它看起来 - 对我来说 - 就像我有一切正确一样。任何人都可以说出可能出错的地方???
我知道我的connectionString AuthContext
是正确的,因为我以前使用过它。
答案 0 :(得分:17)
当您使用带有ASP.NET标识的自定义用户类时,您必须确保为<T>
和{{1}明确指定自定义用户类类型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));
}
,则会遇到您报告的错误。
答案 1 :(得分:9)
我遇到了同样的问题,我记得在MVC4中使用SimpleMembership时遇到了类似的问题。
我正在进行数据库优先开发,所以我有一个EDMX文件。事实证明,ASP.NET Identity不喜欢生成.edmx模型文件时创建的连接字符串。如果你正在使用。 EDM连接字符串:base(“EDMConnString”)你很可能会遇到这个问题。
我通过创建一个标准连接字符串来修复此问题,该字符串指向ASP.NET标识表所在的数据库(在我的情况下是相同的数据库),在以下位置使用该连接字符串,并且它起作用。
像这样的东西
<add name="IdentityConnection" connectionString="data source=THEJUS\SQLSERVER2014;initial catalog=IdentitySample;integrated security=True;MultipleActiveResultSets=True;App=IdentitySample.Admin" providerName="System.Data.SqlClient" />
答案 2 :(得分:5)
当我向我的项目介绍DI时,我遇到了这个错误。使用AutoFac和Identity我必须添加以下内容:builder.RegisterType<ApplicationDbContext>().As<DbContext>().InstancePerLifetimeScope();
如果没有这个,当AutoFac创建我的UserStore实例时,它正在使用默认的UserStore()
ctor创建一个新的IdentityDbContext
,而不是我的ApplicationDbContext
。
使用此行,我UserStore(DbContext context)
会调用ApplicationDbContext
ctor。
答案 3 :(得分:0)
这是我在解决此问题时想出的一些步骤