【问题标题】:AspNet Identity ApplicationUser with subtype-specific fields具有子类型特定字段的 AspNet Identity ApplicationUser
【发布时间】:2016-05-03 14:46:18
【问题描述】:

我有一个使用 ASP.NET 标识的 ASP.NET MVC 应用程序。我的应用程序有 3 个角色:

  • 学生
  • 作者
  • 管理员

这 3 个配置文件有不同的字段要保留,因此学生角色可能有 X 个字段、作者角色、Y 个字段和管理员角色、Z 个字段,所有这些都彼此不相关。问题是我想不出一种方法来做出优雅的设计。

这是我尝试过的/虽然到目前为止:

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

这是我目前实施的。我有一个 ApplicationUser 类(表),它包含这三个角色的所有公共字段。 对于它们中的每一个,我都创建了一个与 ApplicationUser 具有 1:1 关系的类(表)(充当“基”类(表))

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

对此有什么清洁设计的建议吗?

更新

从研究中我了解到模型继承/超类型-子类型关联可能是一个不错的方法。尤其是单表实现在性能上似乎也不错。 例如:

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

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

【问题讨论】:

  • 学生可以成为作者,作者可以是管理员,管理员可以是学生吗?
  • @Erresen 学生永远不会拥有提升的权限。作者可以升级为管理员角色。管理员将保持管理员身份。所以本质上,只有作者才能成为管理员(如果管理员将他们添加为一个)。
  • 学生、作者和管理员的字段之间(或三者中的任意两个)之间是否存在共性?如果不是,那么我将只使用三个单独的表(否则,如果您将作者升级为管理员,然后再降级,您可能会丢失数据)。如果有任何共同点,我会将这些字段放在 ApplicationUser 或另一个“基本”表中,然后为任何特定于类的字段添加额外的表。
  • @technophile这正是我现在所做的。我过滤掉了公共字段,它们都驻留在 ApplicationUser 表中。学生、作者和管理员只有他们的特定字段。我会更新这个问题,这样就可以清楚了。感谢您指出。

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


【解决方案1】:

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

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

  • 用户的外键
  • 属性的数据类型
  • 属性名称
  • 属性值

---------------------------------
| FK |  Type  | Name | Value    |
---------------------------------
| 1  | string | name | John Doe |
---------------------------------
| 1  |  int   | age  |    30    |
---------------------------------

您可以在下面看到一个示例,说明控制器的操作可以接受什么作为参数(我假设 name 和 age 是只有 Student 需要的字段)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 2014-02-11
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多