【问题标题】:ASP.NET Core 2: UserManager vs. DbContextASP.NET Core 2:UserManager 与 DbContext
【发布时间】:2018-03-17 04:09:50
【问题描述】:

我正在为我的用户模型使用通用的IdentityUser<T> 类,并使用string 作为主键一切正常,但我想使用long 作为键类型。所以,我使用的是 IdentityUser 的通用版本。现在我发现 UserManager 有如下定义:

public class UserManager<TUser> : IDisposable where TUser : class

还有下面的函数

public virtual Task<TUser> FindByIdAsync(string userId);

这似乎不适合在一起,因为该函数需要一个字符串作为键/ID。 TUser 必须是 TUser&lt;TKey&gt;

现在的问题是,是否会因为将字符串解析为 long(当然有)而导致性能损失,还是使用普通数据库选择直接从 DbContext 获取用户对象更好? UserManager 是否有任何好处,因此即使有字符串键要求也建议使用它?

谢谢!

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

    FindByIdAsync 总是使用字符串,因为它是每个类的共同点。而不是到处都用泛型污染(如在 Identity v2 中),您必须将您的数字转换为字符串并传递它。在 DB 方面,无论如何都是 handled by EF

    您可以拥有自己的继承自 UserManager 的 UserManager 类,并拥有一个覆盖 FindByIdAsync(long id) 的方法,该方法只执行 id.ToString()

        public virtual Task<TUser> FindByIdAsync(long userId)
        {
             return base.FindByIdAsync(userId.ToString());
        }
    

    【讨论】:

    • 好的。我懂了。非常感谢!
    【解决方案2】:

    您可以通过像这样扩展 IdentityUser 类来设置您的 User 表以使用不同类型的主键:

    public class MyUser : IdentityUser&lt;long&gt;

    然后将UserManager&lt;MyUser&gt; 注入你的类来管理它们。

    https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-primary-key-configuration?tabs=aspnetcore2x

    【讨论】:

    • 这正是我所做的。但是 UserManager 没有 FindByIdAsync 函数的泛型。它是一个静态字符串参数类型。那是我的问题。
    • 哦,我明白了。我没有意识到 FindByIdAsync 总是接受一个字符串并假设它会使用T。我仍然会将 long 转换为字符串。我怀疑转换成本是否值得失去 UserManager 和其他身份类的便利。
    • 我也很惊讶。但似乎 UserManager 应该对任何类型的用户模型“开放”,而不仅仅是 IdentityUser
    【解决方案3】:

    this 链接您可以看到可以更改密钥的类型。最初它被设置为字符串,因此您可以立即使用 int 或 guid 等值。

    代码取自上述链接。 首先将您的用户更改为所需的密钥类型:

     public class ApplicationUser : IdentityUser<long>
     {
     }
    

    编辑应用程序角色类:

    public class ApplicationRole : IdentityRole<long>
    {
    } 
    

    在应用程序上下文类中,添加您的新密钥:

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, long>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 2018-10-01
    • 2014-05-04
    • 2019-08-08
    • 2023-03-03
    • 2020-03-04
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多