【问题标题】:Architecture and ASP.Net Identity体系结构和 ASP.Net 身份
【发布时间】:2017-08-05 00:12:27
【问题描述】:

我目前正在关注以下 GitHub,以获取有关将用户数据从 ASP.Net Identity 存储到 Mongo 的指导:https://github.com/g0t4/aspnet-identity-mongo。通过基本的概念证明,我已经能够成功地存储用户数据。我当前面临的问题是我的应用程序需要两种类型的用户(两者都将存储到同一个 Mongo 集合中)。

为简单起见,我们可以称用户 A 和 B。A 和 B 都设置为模型,并具有自己的属性。我最初的想法是将 A 和 B 都设置为 ApplicationUser 的派生类(请参阅引用的 repo 中的 IdentityModels.cs 文件)。

注册到我的应用程序与此架构完美配合,并且 JSON 文档已发布/存储到我的 MongoDB 中。问题是当我尝试登录时。发布后,我收到服务器错误:

元素不匹配类的任何字段或属性 Models.ApplicationUser

当我将模型 A 的所有元素放入 ApplicationUser 时,错误消失了;然而,这使得模型 B 的问题没有得到考虑。因此,我想问我最好的方法是什么?我正在考虑的一些想法涉及创建两个独特的 UserManager,使用一个包含所有元素的大型 JSON 文档(似乎有点杂乱无章),或者可能使用一个 UserManager 和两个模型的适配器?

【问题讨论】:

    标签: c# asp.net-mvc mongodb architecture asp.net-identity


    【解决方案1】:

    您的设置方式很好,也应该如此。问题似乎在于 Mongo 如何处理继承,尽管对于 SQL Server 之类的东西,您仍然会遇到不同但同样有问题的问题。

    简而言之,这里似乎发生的事情是,您实际上是将UserA/UserB 向上转换为ApplicationUser,但由于JSON 包含来自这些派生类的属性,而ApplicationUser 没有, Mongo 被它噎住了。解决方案是使用多个UserManagers。这是一个接受TUser 类型参数的泛型类型。默认实现是UserManager<ApplicationUser>,但假设一切都是ApplicationUser。如果您有派生的用户类型,那么您需要使用特定类型的 UserManager<TUser> 实例,即 UserManager<UserA>UserManager<UserB>

    FWIW,您在使用另一个数据存储时遇到的问题是,所保存的类型决定了为使用查询实例化正确类型而添加的 Discriminator 列的值。即使您正在创建UserA,例如,如果您使用UserManager<ApplicationUser> 的实例,它将被向上转换为ApplicationUser 并且保存ApplicationUser,而不是UserA。这与您的 Mongo 设置中发生的情况类似,但 SQL Server 之类的东西会很高兴地接受它(尽管您的数据会被弄乱),而 Mongo 会出错。

    无论长短,始终使用特定于您正在使用的用户类型的 UserManager<TUser> 实例。

    【讨论】:

    • 做到了!谢谢你的解释!
    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多