如何创建两种具有标识和.net核心的用户2

时间:2018-03-02 16:31:45

标签: asp.net-identity asp.net-core-2.0 asp.net-core-webapi

我开始使用.net core 2和Web服务开发Web应用程序..

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

如何在.net核心中使用Identity处理它?<​​/ p>

2 个答案:

答案 0 :(得分:3)

只需继承ApplicationUser,即:

public class CompanyUser : ApplicationUser {}

public class SimpleUser : ApplicationUser {}

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

如果您愿意,可以按类型实施TPT或表格。这将为ApplicationUser提供标准表,其中包含所有公共属性的列和每个派生类型的表,仅包含在该派生类型上定义的属性和返回到ApplicationUser表的外键。使用此方法,您可以在派生类上具有不可为空的属性,但查询用户则需要连接。如果您想要使用此路由,可以使用您希望其表所具有的名称将Table属性添加到派生类中,或者使用{{1}中的ToTable流畅配置方法做同样的事。

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

答案 1 :(得分:0)

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