我开始使用.net core 2和Web服务开发Web应用程序。
当用户在网站上注册时,他可以选择他是公司还是简单用户,因此我将数据存储在特定的表中,但登录数据存储在AspNetUsers中。
如何在.net核心中使用Identity处理它?
简单地继承自ApplicationUser
,即:
public class CompanyUser : ApplicationUser {}
public class SimpleUser : ApplicationUser {}
默认情况下,EF将通过STI实现继承(单表继承)。基本上,ApplicationUser
和所有派生的所有属性都将进入ApplicationUser
表(即AspNetUsers
)。将添加一个Discriminator
列,其中包含已保存的实际类的名称。然后,EF将在查询时使用它来实例化正确的类型。这种方法的一个缺点是派生类的属性必须是可空的,因为并非每种类型的使用都能够为其他用户类型的属性提供值。
如果您愿意,可以按类型实施TPT或表格。这将为您提供ApplicationUser
的标准表,其中包含所有公共属性的列和每个派生类型的表,仅包含在该派生类型上定义的属性以及返回ApplicationUser
表的外键。使用此方法,您可以在派生类上具有不可为空的属性,但查询用户则需要连接。如果你想走这条路线,你可以将Table
属性添加到你想要它的表所具有的名称的派生类,或者使用ToTable
中的OnModelCreating
流畅配置方法来做同样的事。
您需要记住的一件事是,与UserManager<TUser>
等用户一起使用的泛型类需要根据您需要使用的类型进行实例化。例如,即使您执行new CompanyUser()
,如果您通过UserManager<ApplicationUser>
实例保存它,它将被上传并保存为ApplicationUser
的实例。要实际保存CompanyUser
实例,您需要使用UserManager<CompanyUser>
的实例。
如果你想将两个用户的数据存储在同一个表中,请使用每个层次结构的TPH表格,如果你有很多用于类的esch的列,请使用TPT这里是一个带有非常好的解释的链接https://www.learnentityframeworkcore.com/inheritance/table-per-hierarchy