如何使用身份和.net core 2创建两种类型的用户

Cic*_*iux 1 asp.net-identity asp.net-core-webapi asp.net-core-2.0

我开始开发具有.net core 2和Web服务的Web应用程序。

当用户在站点上注册时,他可以选择自己是公司还是简单用户,因此我将数据存储在特定表中,但登录数据存储在AspNetUsers中。

如何使用.net Core中的Identity处理它?

Chr*_*att 6

只需继承ApplicationUser,即:

public class CompanyUser : ApplicationUser {}

public class SimpleUser : ApplicationUser {}
Run Code Online (Sandbox Code Playgroud)

默认情况下,EF将通过STI(单表继承)实现继承。本质上,的所有属性ApplicationUser和所有派生都将进入的表ApplicationUser(即AspNetUsers)。Discriminator将添加一列,其中将保存已保存的实际类的名称。然后,EF将在查询时使用此实例化正确的类型。这种方法的一个缺点是,派生类的属性必须是可为空的,因为并非每种使用类型都能够为其他用户类型的属性提供值。

如果愿意,可以按类型实现TPT或表。这将为您提供标准表,ApplicationUser其中包含所有通用属性的列以及每个派生类型的表,其中仅包含在该派生类型上定义的属性,并包含返回到表的外键ApplicationUser。使用这种方法,您可以在派生类上具有不可为空的属性,但是查询用户将需要连接。如果您想走这条路,则可以将Table属性添加到派生类中,并使用其表具有的名称,也可以使用ToTablefluent config方法OnModelCreating执行此操作。

您需要牢记的一件事是,与用户一起使用的通用类(例如)UserManager<TUser>需要针对您需要使用的每种类型进行实例化。例如,即使您这样做new CompanyUser(),如果通过它的一个实例保存它UserManager<ApplicationUser>,也会被上传并保存为的一个实例ApplicationUser。要实际保存CompanyUser实例,您需要使用的实例UserManager<CompanyUser>