【发布时间】:2024-01-23 22:11:01
【问题描述】:
我正在尝试为我的 MVC 5 应用程序实现一个自定义 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();
}
}
现在,似乎当我在 CustomUserManager 上调用 UpdateAsync 时,它并没有通过我的自定义 CustomUserStore,而是通过一些默认实现或其他方式。问题很明显,因为CustomUserManager.UpdateAsync() 返回Task<IdentityResult>,而我在CustomUserStore 中的实现只返回Task。因此没有错误或任何东西,但没有调用该方法。我认为IUserPasswordStore<User, int> 应该有一些方法UpdateAsync 返回Task<IdentityResult>,但它没有......
另一方面,FindByIdAsync 方法确实可以正常工作,并在我的 CustomUserStore 中调用该方法。
我很确定问题是由于继承了具有自定义键类型(在我的情况下为 int)的类。我可以在网上找到的自定义 UserStore 的任何示例都只使用字符串键并且不继承 IUserStore<User, int> 而只是 IUserStore<User>。
但是我无法弄清楚我的问题。也许我可以重写CustomUserManager 中的所有方法,但这似乎是一种变通方法,而不是一种解决方案。这可能是框架中的错误吗,我认为自定义键类型仍然相对较新,甚至处于 alpha 阶段?
【问题讨论】:
-
你能解决这个问题吗?
标签: asp.net-mvc model-view-controller identity asp.net-identity-2