我有一个使用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个不同的数据源,这不是我想要的。
有关清洁设计的任何建议吗?
更新
从研究中我得到一个模型继承/超类型 - 子类型关联可能是一个很好的方法。特别是使用一个表实现似乎也表现良好。 例如:
可能会导致特定于子类型字段的null
个值,但似乎是一个很好的解决方法。还有其他建议吗?
答案 0 :(得分:2)
我认为你的方法非常好。另一种方法是使用asp.net Identity的UserClaims之类的方法。
在这种方法中,您不需要为每个角色设置特定字段,而是需要存储4列的表格
---------------------------------
| 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}
}