【发布时间】: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 次以上的哈希处理,以确保很难使用暴力破解来恢复它。
标签: c# .net-core asp.net-core-mvc