如何将自动生成的主键复制到另一个表中
Posted
技术标签:
【中文标题】如何将自动生成的主键复制到另一个表中【英文标题】:How to replicate autogenerated primary key into another table 【发布时间】:2021-11-18 07:05:18 【问题描述】:在 ASP.NET Core MVC 中,我使用的是代码优先迁移。我有这两个模型:
型号:
public class User
public int Id get; set;
public string Email get; set;
public string Password get; set;
public class Student
[Key]
public int Id get; set;
[Required]
[StringLength(20)]
public string FirstName get; set;
[Required]
[StringLength(20)]
public string LastName get; set;
[Required]
[StringLength(40)]
public string Guardian get; set;
[Required]
public DateTime DateOfBirth get; set;
[EmailAddress]
[Required]
public string Email get; set;
public bool AdminPermition get; set;
那么这两者在一个 ViewModel 中:
视图模型:
public class StudentRegisterModel
[Required]
[StringLength(20)]
public string FirstName get; set;
[Required]
[StringLength(20)]
public string LastName get; set;
[Required]
[StringLength(40)]
public string Guardian get; set;
[Required]
public DateTime DateOfBirth get; set;
[EmailAddress]
[Required]
public string Email get; set;
[Required]
public string Password get; set;
[Required]
public string ConfirmPassword get; set;
使用此服务保存所有内容:
服务:
public async Task<bool> RegistrationService(StudentRegisterModel registerModel)
try
//validation functions
var context = new ValidationContext(registerModel, serviceProvider: null, items: null);
var results = new List<ValidationResult>();
if (Validator.TryValidateObject(registerModel, context, results, true))
if (CheckEmailAvailability(registerModel.Email))
if (registerModel.Password != registerModel.ConfirmPassword)
return false;
Student student = new Student
FirstName = registerModel.FirstName,
LastName = registerModel.LastName,
Email = registerModel.Email,
Guardian = registerModel.Guardian,
DateOfBirth = registerModel.DateOfBirth,
AdminPermition = false
;
User user = new User
Email = registerModel.Email,
Password = Encoder(registerModel.Password),
;
_context.Add(student);
_context.Add(user);
await _context.SaveChangesAsync();
return true;
return false;
catch
return false;
User 中的 Id 是自动生成的,而 Student 中的 Id 不是。
如何自动将 User 中的 Id 复制到 Student 中的 Id 中?
谢谢
【问题讨论】:
automatically duplicate the Id in User into the Id in Student?
为什么要这样做?这个问题与 Web 框架 MVC 无关。它与 EF Core、ORM 和数据库建模有关。也不涉及复制。 Student
和 User
之间的实际关系是什么,他们为什么要分享任何信息?有继承关系吗?还是Student
和User
实体是独立的?毕竟,系统的用户并不总是学生。甚至同一个人也可以是一门课程的学生和另一门课程的导师。也可能不是每个学生都有一个用户
将身份验证模型与应用程序的业务模型混为一谈也是一个坏主意。在 ASP.NET MVC Core 中,已经有一个身份验证和授权中间件,具有自己的安全帐户存储。将这些表与业务表相结合只会产生冲突——当学生首先注册并且仅在课程开始之前创建一个帐户时会发生什么?如果该 ID 只是一个 OAuth 令牌怎么办?当User
被删除时会发生什么?
@PanagiotisKanavos - 如果我想让 User 中的 Id 自动成为 Student 中的外键 (userid) 怎么样。谢谢
为什么要这样做?您仍在询问您假设的解决方案,而不是实际问题。抛开设计问题不谈,您要求的是创建 1-1 关系。像所有关系一样,它们是通过设置适当的导航属性来建立的。 fbede 的回答显示了如何做到这一点,虽然有一个单独的 UserId
字段会好很多
另一方面,处理User
的整个方式是错误的、简单明了的。使用内置的 Identity 中间件,不要尝试自己发明。密码不应该被加密或编码,它们需要使用适合密码散列的算法加盐和散列。这些算法对加盐密码进行了 1000 次以上的哈希处理,以确保很难使用暴力破解来恢复它。
【参考方案1】:
我认为这样的事情应该可行:
public class User
[Key]
public int Id get; set;
[InverseProperty("Student")]
public Student Student get; set;
// ...
public class Student
[Key]
public int Id get; set;
[ForeignKey("Id")]
public User User get; set;
// ...
【讨论】:
以上是关于如何将自动生成的主键复制到另一个表中的主要内容,如果未能解决你的问题,请参考以下文章