【问题标题】: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 次以上的哈希处理,以确保很难使用暴力破解来恢复它。

标签: c# .net-core asp.net-core-mvc


【解决方案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; }

    // ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 2022-01-04
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多