为了账号安全,请及时绑定邮箱和手机立即绑定

从父对象获取派生属性的数据

从父对象获取派生属性的数据

C#
ITMISS 2021-11-14 10:09:25
我有两个用户对象,学生和教授。每个用户都可以有自己的设置,如下所示:public class PersonSettings{    public Guid Id { get; set; }    public Guid PersonId { get; set; }    public PersonSettingsValues Settings { get; set; }}public class PersonSettingsValues{    public bool NotificationsEnabled { get; set; }}public class StudentSettingsValues : PersonSettingsValues{    public int GymPassTypeId { get; set; }}public class ProfessorSettingsValues : PersonSettingsValues{    public bool AllowOfficeHours { get; set; }}有些设置是共享的,但是学生和教授也有自己的设置,所以我继承了模型。我只是通过使用 PersonSettings 上的转换值将设置作为 json 存储在数据库中:builder.Property(ps => ps.Settings).HasConversion(    s => JsonConvert.SerializeObject(s, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }),    s => JsonConvert.DeserializeObject<PersonSettingsValues>(s, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));因此,PersonSettings 表中填充了几条带有设置的记录,其中一些将 Settings 列中的数据格式化为 StudentSettings,而另一些则是 Prof我想要做的是有一个端点,它将为学生返回 StudentSettings。我有:[HttpGet("{personId}")]public async Task<IActionResult> GetStudentSettings([FromRoute] Guid personId){    var personSettings = await _context.PersonSettings        .FirstOrDefaultAsync(ps => ps.PersonId == id);    return Ok(personSettings);}问题是设置属性只填充了 PersonSettingsValues,我没有得到 StudentSettingsValues。我不知道如何让它做到这一点。我尝试改用 DTO 并使用 AutoMapper 映射到它:public class StudentSettingsDTO{    public Guid Id { get; set; }    public Guid PersonId { get; set; }    public StudentSettingsValues Settings { get; set; }}...[HttpGet("{personId}")]public async Task<IActionResult> GetStudentSettings([FromRoute] Guid personId){    var personSettings = await _context.PersonSettings        .FirstOrDefaultAsync(ps => ps.PersonId == id);    return Ok(_mapper.Map<StudentSettingsDTO>(personSettings));}在我的映射中,我只是尝试将 Settings 转换为 StudentSettingsValues 类型,但是我收到一条错误消息无法将“PersonSettingsValues”类型的对象转换为“StudentSettingsValues”不知道我在这里做错了什么,我怎么能只返回一个带有 StudentSettings 或ProfessionalSettings 的 PersonSettings 对象?
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

这是因为您的构建器在从数据库解析 json 时解析为 PersonSettingsValues。完成后,您将丢失所有其他数据。您有几个选择:

  1. 不确定这个构建器到底是什么以及您可以添加多少自定义逻辑。但是如果在反序列化时你知道它是教授还是学生,你应该反序列化你需要的对象。然后,即使您将它分配给 PersonSettingsValues,您仍然可以稍后将其转换为更具体的类型。

  2. 而不是不同的模型,制作接口。IPersonSettingsValues、IStudentSettingsValues 和 IProfessorSettingsValues。然后只有一个实现所有接口的模型。然后你的解串器可以序列化到那个模型。不存在的值将变为默认值,但它始终会被反序列化。然后当您想从特定上下文使用它时,您将能够将其转换为特定接口。

  3. 反序列化为动态对象(因此它只是反序列化 json 中的任何内容),然后使用 autoMapper 将动态对象映射到具体类型。

如果不清楚,请告诉我,我会尝试提出一个代码示例。


查看完整回答
反对 回复 2021-11-14
  • 1 回答
  • 0 关注
  • 167 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信