MVC 5 Identity 2 - методы UserStore клиента не вызываются

Я пытаюсь реализовать собственный UserStore для своего приложения MVC 5, чтобы я мог делегировать команды базы данных моему существующему проекту базы данных.

Таблицы в моей базе данных используют целочисленные ключи, поэтому я создал собственный UserManager, который наследует UserManager<User, int>, а не только UserManager<User>. По этой причине я также создал собственный UserStore, который реализует IUserPasswordStore<User, int>, а не только IUserPasswordStore<User>.

Кратко:

public class CustomUserManager : UserManager<User, int>
{
    public CustomUserManager(CustomUserStore store) : base(store) 
    {
    }
}

public class CustomUserStore : IUserPasswordStore<User, int>
{
    private readonly DbContext _db;

    public CustomUserStore(DbContext db)
    {
        _db = db;
    }

    public Task<User> FindByIdAsync(int userId)
    {
        return _db.users.SingleOrDefaultAsync(u => u.Id == userId);
    }

    public Task UpdateAsync(User user)
    {
        _db.Entry(user).State = System.Data.Entity.EntityState.Modified;
        return _db.SaveChangesAsync();
    }
}

Теперь кажется, что когда я вызываю UpdateAsync для CustomUserManager, он проходит не через мой пользовательский CustomUserStore, а через какую-то реализацию по умолчанию или что-то в этом роде. Проблема очевидна, потому что CustomUserManager.UpdateAsync() возвращает Task<IdentityResult>, а моя реализация в CustomUserStore возвращает только Task. Следовательно, нет никаких ошибок или чего-то еще, но метод не вызывается. Я думаю, что IUserPasswordStore<User, int> должен иметь какой-то метод UpdateAsync, который возвращает Task<IdentityResult>, но он не...

С другой стороны, метод FindByIdAsync работает нормально и вызывает метод в моем файле CustomUserStore.

Я совершенно уверен, что проблема связана с наследованием классов с пользовательским типом ключа (int в моем случае). Любой пример пользовательского хранилища UserStore, который я могу найти в Интернете, просто использует строковые ключи и наследует не IUserStore<User, int>, а только IUserStore<User>.

Однако я не могу понять свою проблему. Возможно, я могу просто переопределить все методы в моем CustomUserManager, но это похоже на обходной путь, а не на решение. Возможно, это ошибка в структуре, я думаю, что пользовательские типы ключей все еще относительно новые или даже находятся в альфа-версии?


person Nick Thissen    schedule 22.10.2014    source источник
comment
Вы в состоянии решить это?   -  person Anil    schedule 22.05.2015


Ответы (1)


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

Просто, если вы вызовете UserManager.UpdateAsync, в базовом классе вы увидите, что перед UserStore.UpdateAsync происходит проверка, которая в моем случае не удалась (причина не имеет значения). Поэтому, пожалуйста, будьте так любезны и проверьте в своем классе (классе контроллера) результат UpdateAsync, который является IdentityResult и более чем уверен, что результат Succes является ложным.

Эвдин

person Edi    schedule 11.05.2015