Тип объекта IdentityUser не является частью модели для текущего контекста

Я вижу ту же проблему, что и этот, но представленный там сценарий, похоже, не применяется, поэтому я думаю, что у меня другая проблема. На самом деле, я вижу несколько вопросов о 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 верна, потому что я использовал ее ранее.

Ответ 1

Когда вы используете пользовательский класс с идентификатором ASP.NET, вы должны убедиться, что вы явно указываете тип пользовательского типа <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, если вы хотите использовать пользовательский класс, вы получите сообщение об ошибке, о котором вы сообщили.

Ответ 2

У меня была такая же проблема, и я помню, что у меня была аналогичная проблема с SimpleMembership в MVC4.

Я делаю первую разработку базы данных, поэтому у меня есть файл EDMX. Оказывается, ASP.NET Identity не любит строку соединения, которая создается при создании файла модели .edmx. Если вы используете. EDM в: base ( "EDMConnString" ), у вас, скорее всего, будет эта проблема.

Я исправил это, создав стандартную строку соединения, которая указывала на базу данных, где таблицы ASP.NET Identity (в моем случае одна и та же база данных), использовала эту строку соединения в базе и работала.

Что-то вроде этого

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

Ответ 3

Я получил эту ошибку, когда я представил DI в свой проект. Используя AutoFac и Identity, мне пришлось добавить следующее: builder.RegisterType<ApplicationDbContext>().As<DbContext>().InstancePerLifetimeScope();

Без этого, когда AutoFac создавал экземпляр UserStore, он использовал стандартный UserStore() ctor, который создает новый IdentityDbContext, а не мой ApplicationDbContext.

С этой строкой вызывается UserStore(DbContext context) ctor, с моим ApplicationDbContext.