具有子类型特定字段的AspNet Identity ApplicationUser

时间:2016-05-03 14:46:19

标签: sql-server asp.net-mvc asp.net-identity

我有一个使用ASP.NET身份的ASP.NET MVC应用程序。我的申请有3个角色:

  • 学生
  • 作者
  • 管理

这3个配置文件有多个要保留的字段,因此学生角色可以有X个字段,作者角色,Y个字段和Admin角色,Z个字段,所有字段都彼此无关。问题是我无法想出一种优雅设计的方法。

到目前为止,这是我尝试过的内容:

首先,我创建了3个不同的类(对于每个角色),所以基本上我将拥有Student,Author和Admin表,它们与ApplicationUser表有1:1的关系,但这不是干净的解决方案。

这是我目前正在实施的内容。我有一个ApplicationUser类(表),它包含这三个角色的所有常见字段。 对于他们每个人,我创建了一个与ApplicationUser有1:1关系的类(表)(作为" base" class(table))

我提出的另一个解决方案是将这些数据保存在无模式存储(例如表存储)上,其中PartitionKey是ApplicationUser.Id,RowKey是RoleId,因此我可以轻松地对每个实体进行CRUD。虽然这可能有所帮助,但这种方法可能会导致维护2个不同的数据源,这不是我想要的。

有关清洁设计的任何建议吗?

更新

从研究中我得到一个模型继承/超类型 - 子类型关联可能是一个很好的方法。特别是使用一个表实现似乎也表现良好。 例如:

  • 创建一个ApplicationUser表,其中包含所有字段(公共和特定于子类型)
  • 为学生,作者和管理员提供3个额外的观点。

可能会导致特定于子类型字段的null个值,但似乎是一个很好的解决方法。还有其他建议吗?

1 个答案:

答案 0 :(得分:2)

我认为你的方法非常好。另一种方法是使用asp.net Identity的UserClaims之类的方法。

在这种方法中,您不需要为每个角色设置特定字段,而是需要存储4列的表格

  • 用户的FK
  • 属性的数据类型
  • 属性的名称
  • 属性值
---------------------------------
| FK |  Type  | Name | Value    |
---------------------------------
| 1  | string | name | John Doe |
---------------------------------
| 1  |  int   | age  |    30    |
---------------------------------

下面你可以看到一个控制器动作可以作为参数接受的例子(我假设名称和年龄是你只需要学生的字段)。

{
  id:1, 
  updatedOn : '2016-01-01 00:01', 
  role:'Student', 
  extraFields : {
                  name:'John Doe', 
                  age : 30}
}