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