Csharp/C#教程:自定义和集成自己的数据库与mvc5身份分享


自定义和集成自己的数据库与mvc5身份

我正在开发一个MVC项目,该项目需要使用Identity创建的身份validation和授权,我的项目数据库还包括应该使用该系统的主要实体,处理这种情况的最佳实践是什么。

  1. 我应该根据我的要求自定义身份ApplicationUser。
  2. 创建我自己的表(模型)并将它们与身份表集成,我不知道如何做到这一点。 或任何其他解决方案。

您当然应该自定义Identity实体,因为这是创建Identity的全部原因:允许更大的可扩展性。 要拥有不同类型的“用户”,您应该从ApplicationUserinheritance; 重要的是, 不是直接来自IdentityUser 。 这将确保核心身份关系(角色,声明,登录等)都绑定到单个“用户”表,然后您可以扩展该表或创建其他表来保存其他用户数据。

 public class ApplicationUser : IdentityUser public class Student : ApplicationUser public class Instructor : ApplicationUser 

默认情况下,此inheritance将由TPH(每个层次表)实现,也称为STI(单表inheritance)。 这意味着所有派生类的所有属性都将由单个数据库表上的列表示。 还将添加一个Discriminator列,它将保存已保存的实际类的名称,即“ApplicationUser”,“Student”或“Ins​​tructor”。 从查询构建对象图时,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一个实例,因为它是一个通用的类型。 如果您需要专门使用StudentInstructor ,则需要分别实例化UserManagerUserManager 。 您不能使用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

(0)
上一篇 2021年12月24日
下一篇 2021年12月24日

精彩推荐