1

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

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

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

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

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

+0

Можете ли вы это решить? – Anil

ответ

0

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

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

Evdin

Смежные вопросы