Dot*_*row 1 asp.net asp.net-mvc asp.net-mvc-5
我正在处理asp.net MVC 5应用程序。我正在使用身份创建用户。我是第一次使用它,并创建了第一个mvc 5应用程序。我有两种类型的用户。我想要两种类型的用户都有两个表。因此,应先将记录插入aspnetuser表中,然后再插入相关表中,aspnetuser表应与两个表链接在一起,以便我可以访问它们。我已经为两种类型的用户创建了模型。如何将它们与模型中的身份相关联?
请建议
好吧,首先,至少在身份标识方面,您只能真正拥有一个用户。不过,您可以将单个用户作为子类来创建其他类型。因此,从本质上讲,您将具有类似以下的设置:
public class ApplicationUser : IdentityUser
{
...
}
public class FooUser : ApplicationUser
{
...
}
public class BarUser : ApplicationUser
{
...
}
public class BazUser : ApplicationUser
{
...
}
Run Code Online (Sandbox Code Playgroud)
换句话说,只有一个类直接继承自IdentityUser,而您的所有各种类型都将从该一个类继承(在本例中为ApplicationUser)。
默认情况下,实体框架通过STI或单表继承处理继承。它的工作方式是只有一个表AspNetUsers(Identity用户的默认表名),并且子类添加的所有属性都将作为该表的列添加。这意味着您所有的子类属性都必须是可为空的,因为如果保留了其他子类或仅基ApplicationUser类,则不会设置该属性。
如果不可接受,则可以实施其他继承策略,即TPT(按表类型)和TPC(按表类型)。在TPT中,基本共享属性全部放在一个表中,然后每个子类型都有自己的表,其中仅包含为其添加的属性的列。在TPC中,每个类都为所有内容获取自己的表,因此每个单独的子类型都将添加所有的Identity列。我不认为此特定选项会与Identity兼容,或者至少会非常繁重,因为角色和声明之类的东西之间的所有外键关系都必须在每个表中重复。即使您可以破解Identity来完成这项工作,您也将失去与所有用户(无论类型如何)一次做任何内聚的凝聚力的方式。
基本上,您的选项是默认选项,也称为TPH(逐层表)或TPT。但是,TPT效率较低,因为它本质上要求每个查询都必须具有联接才能获取完整实例。如果您绝对需要在子类上具有不可为空的属性,那么这可能是一个适当的选择。但是,请记住,该属性只需要在数据库级别可以为空。如果使用TPH,您仍然可以通过在应用程序中进行验证来要求这些属性具有值。
| 归档时间: |
|
| 查看次数: |
745 次 |
| 最近记录: |