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

Bre*_*ett 14 c# asp.net-mvc entity-framework asp.net-identity

我看到了与这个问题相同的问题,但那里提出的情景似乎并不适用所以我认为我有一个不同的问题.事实上,我在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; }
}
Run Code Online (Sandbox Code Playgroud)

我的背景:

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

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    return result;
}
Run Code Online (Sandbox Code Playgroud)

我得到错误:The entity type IdentityUser is not part of the model for the current context.我无法弄清楚这个错误意味着什么,因为它看起来 - 对我来说 - 就像我有一切正确.任何人都可以告诉可能出错的地方???

我知道我的connectionString AuthContext是正确的,因为我之前使用过它.

Dav*_*sey 18

当您使用与ASP.NET身份的自定义用户类,你必须确保你明确指定自定义用户类类型<T>到两个UserManagerUserStore的实例.

private UserManager<UserModel> _userManager;

public AccountController()
{
    AuthContext _ctx = new AuthContext();

    UserStore<UserModel> userStore = new UserStore<UserModel>(_ctx);
    _userManager = new UserManager<UserModel>(userStore);     
}
Run Code Online (Sandbox Code Playgroud)

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

private UserManager<UserModel> _userManager;

public AccountController()
{
    AuthContext _ctx = new AuthContext();    
    _userManager = new UserManager<UserModel>(new UserStore<UserModel>(_ctx));     
}
Run Code Online (Sandbox Code Playgroud)

如果允许类型默认为IdentityUser您要使用自定义类,则会遇到您报告的错误.


the*_*stv 10

我遇到了同样的问题,我记得在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" />
Run Code Online (Sandbox Code Playgroud)

  • 是.这解决了我的问题.需要2个连接字符串.一个用于标识内容,一个用于EF.如果您查看Web.Config,您将看到一个默认连接,然后在安装它时配置一个EF.您可以轻松构建虚拟MVC5并添加EF以查看它们并在数据库相同时使用它们.我的问题是由我之后添加EF的MVC 5应用程序引起的(顺便提一下数据).然后我删除了"DefaultConnection",认为我不需要它.所以Identity使用base中引用的连接.EF使用您在控制器顶部设置的任何实体模型. (3认同)

And*_*y V 5

当我向我的项目介绍DI时,我收到了这个错误.使用AutoFac和Identity我必须添加以下内容:builder.RegisterType<ApplicationDbContext>().As<DbContext>().InstancePerLifetimeScope();

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

有了这条线,UserStore(DbContext context)ctor就会跟我一起打电话ApplicationDbContext.