在asp.net mvc 5应用程序中扩展asp.net标识

时间:2014-12-10 17:30:17

标签: asp.net asp.net-mvc asp.net-mvc-5

我正在研究asp.net MVC 5应用程序。我正在使用Identity来创建用户。我是第一次使用它并创建第一个mvc 5应用程序。我有两种类型的用户。我想为两种类型的用户提供两个表。因此,第一条记录应插入aspnetuser表中,然后插入相关表中,aspnetuser表应与两个表链接,以便我可以访问它们。我为这两类用户创建了模型。我怎样才能将它们与模型中的身份联系起来?

请建议

1 个答案:

答案 0 :(得分:4)

嗯,首先,你只能真正拥有一个用户,至少就身份所做的事情而言。但是,您可以将该单个用户子类化为创建其他类型。所以,基本上,你有一个像:

这样的设置
public class ApplicationUser : IdentityUser
{
    ...
}

public class FooUser : ApplicationUser
{
    ...
}

public class BarUser : ApplicationUser
{
    ...
}

public class BazUser : ApplicationUser
{
    ...
}

换句话说,只有一个类直接从IdentityUser继承,而所有各种类型都将从该类继承(在本例中为ApplicationUser)。

默认情况下,Entity Framework通过STI或单表继承处理继承。这是如何工作的,你只有一个表AspNetUsers(Identity用户的默认表名),你的子类添加的任何属性将被添加为该表的列。这意味着所有子类属性都必须是可空的,因为如果持久化了不同的子类或只保留了基类ApplicationUser类,则不会设置该属性。

如果这是不可接受的,那么可以实现其他继承策略,即TPT(Table-Per-Type)和TPC(Table-Per-Concrete Type)。在TPT中,基本共享属性全部放在一个表中,然后每个子类型都有自己的表,只包含它添加的属性的列。在TPC中,每个类都有自己的表,所以每个子类都会添加所有的Identity列。我不认为这个特定选项会与Identity兼容,或者至少它会非常繁重,因为角色和声明之类的所有外键关系都必须为每个表重复。即使您可以通过破解身份来完成这项工作,您也会失去任何与所有用户一起做任何事情的紧密合作方式,无论其类型如何。

基本上,您的选项是默认选项,也称为TPH(Table-Per-Hierarchy)或TPT。但是,TPT效率较低,因为它实际上只需要为每个查询提供连接以获取完整实例。如果您绝对需要在子类上具有不可为空的属性,那么它可能是一个合适的选项。但是,请记住,该属性只需要在数据库级别可以为空。如果使用TPH,您仍然可以通过应用程序中的验证要求这些属性具有值。