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