如何使用标识和 .net 核心创建两种类型的用户 2.



我开始开发一个带有.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中的ToTablefluent config 方法来执行相同的操作。

您需要记住的一件事是,与用户(如UserManager<TUser>)一起使用的泛型类需要根据您需要使用的类型进行实例化。例如,即使您执行new CompanyUser(),如果您通过UserManager<ApplicationUser>实例保存它,它也将被向上转换并保存为ApplicationUser的实例。要实际保存CompanyUser实例,您需要改用UserManager<CompanyUser>实例。

如果要将两个用户的数据存储在同一个表中,请使用每个层次结构的TPH选项卡,并且如果有许多列用于类的esch,请使用TPT 这是一个非常好的解释的链接 https://www.learnentityframeworkcore.com/inheritance/table-per-hierarchy

相关内容

  • 没有找到相关文章

最新更新