如何将自动生成的主键复制到另一个表中

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 和数据库建模有关。也不涉及复制。 StudentUser 之间的实际关系是什么,他们为什么要分享任何信息?有继承关系吗?还是StudentUser 实体是独立的?毕竟,系统的用户并不总是学生。甚至同一个人也可以是一门课程的学生和另一门课程的导师。也可能不是每个学生都有一个用户 将身份验证模型与应用程序的业务模型混为一谈也是一个坏主意。在 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; 

    // ...

【讨论】:

以上是关于如何将自动生成的主键复制到另一个表中的主要内容,如果未能解决你的问题,请参考以下文章

将自动递增的主键插入 Access 表

如何在插入新行后立即将自动生成的主键值保存到第二列

替换其他表中作为外键的主键

我想将初始值设置为也设置为自动增量选项的主键,例如它从 mysql 中的值 7899 开始? [复制]

Oracle中如何将自动增量添加到现有表中

oracle:物化视图中的主键列