我目前正在关注以下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的问题没有被考虑在内。因此,我想问一下,对我来说最好的路径是什么?我正在打击的一些想法涉及创建两个独特的UserManagers,使用一个包含所有元素的大型JSON文档(看起来有点无组织),或者可能使用一个带有两个模型的适配器的UserManager?
答案 0 :(得分:1)
你设置它的方式很好,它应该是这样的。问题似乎在于Mongo如何处理继承,尽管SQL Server仍然存在一个不同但同样有问题的问题。
简而言之,这里似乎发生的事情是,您基本上将UserA
/ UserB
向上转换为ApplicationUser
,但由于JSON包含来自这些派生类的属性,因此{ {1}}没有,Mongo窒息它。解决方案是使用多个ApplicationUser
。它是一种采用UserManager
类型参数的泛型类型。默认实现是TUser
,但假设所有内容都是UserManager<ApplicationUser>
。如果您已派生用户类型,则需要为这些用户使用特定于类型的ApplicationUser
个实例,例如UserManager<TUser>
和UserManager<UserA>
。
FWIW,您遇到的另一个数据存储的问题是,保存的类型决定了添加的UserManager<UserB>
列的值,以便通过查询实例化正确的类型。例如,即使您正在创建Discriminator
,如果您使用UserA
的实例,也会将其翻译为UserManager<ApplicationUser>
并将保存作为{{1} },而不是ApplicationUser
。这类似于你的Mongo设置中发生的事情,但像SQL Server这样的东西会愉快地接受它(虽然你的数据会被弄乱),而Mongo却错了。
长和短,始终使用特定于您正在使用的用户类型的ApplicationUser
实例。