我有两个用户对象,学生和教授。每个用户都可以有自己的设置,如下所示:
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 对象?
慕盖茨4494581
相关分类