自定义和集成自己的数据库与mvc5身份
我正在开发一个MVC项目,该项目需要使用Identity创建的身份validation和授权,我的项目数据库还包括应该使用该系统的主要实体,处理这种情况的最佳实践是什么。
- 我应该根据我的要求自定义身份ApplicationUser。
- 创建我自己的表(模型)并将它们与身份表集成,我不知道如何做到这一点。 或任何其他解决方案。
您当然应该自定义Identity实体,因为这是创建Identity的全部原因:允许更大的可扩展性。 要拥有不同类型的“用户”,您应该从ApplicationUser
inheritance; 重要的是, 不是直接来自IdentityUser
。 这将确保核心身份关系(角色,声明,登录等)都绑定到单个“用户”表,然后您可以扩展该表或创建其他表来保存其他用户数据。
public class ApplicationUser : IdentityUser public class Student : ApplicationUser public class Instructor : ApplicationUser
默认情况下,此inheritance将由TPH(每个层次表)实现,也称为STI(单表inheritance)。 这意味着所有派生类的所有属性都将由单个数据库表上的列表示。 还将添加一个Discriminator
列,它将保存已保存的实际类的名称,即“ApplicationUser”,“Student”或“Instructor”。 从查询构建对象图时,EF将使用此列来实例化正确的“用户”类型。
这种方法有利有弊。 由于所有内容都存在于单个表中,因此查询简单快捷。 但是,此方法必须使每个派生类的所有属性必须在数据库级别可为空。 明显的原因是因为如果Instructor
有一个必需的专栏,你将无法保存Student
,因为Student
不会拥有满足该要求的财产。 您仍然可以使用视图模型强制在视图级别需要属性。 但是,数据库中的实际列必须是可为空的。
另一种方法是使用所谓的TPT(每种类型的表)。 在此inheritance策略中,将为具有所有公共属性的基类( ApplicationUser
)创建一个表。 然后,将为每个谨慎的派生类创建一个表,其中只包含该类中存在的属性。 外键将添加到基类的表中,然后EF将使用该表将该表中的公共数据连接到派生类表的特定数据。 这种方法允许您在数据库级别强制执行NOT NULL,但它当然需要连接才能引入所有数据,这会降低查询速度。
要实现TPT,只需将[Table]
注释添加到派生类:
[Table("Students")] public class Student : ApplicationUser [Table("Instructors")] public class Instructor : ApplicationUser
最后要注意的是如何使用UserManager
。 如果你搭建了AccountController
,你会注意到它设置了一个UserManager
控制器属性,然后用它来创建用户,查找用户,更改密码等。这实际上是UserManager
一个实例,因为它是一个通用的类型。 如果您需要专门使用Student
或Instructor
,则需要分别实例化UserManager
和UserManager
。 您不能使用UserManager
的实例,因为它会将派生类型向上转换为ApplicationUser
。 例如:
var student = new Student { ... }; await UserManager.CreateAsync(student);
实际上会导致ApplicationUser
保存到数据库中。 特定于学生的数据将被丢弃,并且Discriminator
列的值将为“ApplicationUser”。
上述就是C#学习教程:自定义和集成自己的数据库与mvc5身份分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/988755.html