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

问题描述 投票:0回答:2

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

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

如何在.net核心中使用Identity处理它?

asp.net-identity asp.net-core-2.0 asp.net-core-webapi
2个回答
3
投票

简单地继承自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>的实例。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.