我有一个包含TimeZoneInfo
属性的C#对象。我可以将其保存到MongoDB。但是,当我取回它时,它就空了。所有其他属性均已正确映射。
我的DTO
结构如下所示;还有其他事情,但我只提到了几个属性:
public class TerminalDto
{
public string Code { get; set; }
public GeographyDto Geography { get; set; }
public GeoCoordinateDto GeoCoordinate { get; set; }
public TimeZoneInfo TimeZone { get; set; }
}
我的mongo文档存储为:
{
"_id": "5bc4601d5d46855e6c8a337b",
"Code": "AK",
"Geography": {
"City": "Akron",
"State": {
"Name": "OHIO",
"Code": "OH"
}
},
"GeoCoordinate": {
"Latitude": "40.97665",
"Longitude": "-81.464607"
},
"TimeZone": {
"_id": "Eastern"
}
}
当我读回它时,我的DTO
属性会被填充,但TimeZone info
除外。
{
"_id": "5bc4601d5d46855e6c8a337b",
"Code": "AK",
"Geography": {
"City": "Akron",
"State": {
"Name": "OHIO",
"Code": "OH"
}
},
"GeoCoordinate": {
"Latitude": "40.97665",
"Longitude": "-81.464607"
},
"TimeZone": {} // Empty Here
}
我的终端存储库就是这样的。
public class TerminalRepository
{
public TerminalRepository(IMongoConnectionFactory mongoConnectionFactory)
{
this.collection = mongoConnectionFactory.GetCollection<TerminalDto>();
}
private readonly IMongoCollection<TerminalDto> collection;
public async Task<IEnumerable<TerminalDto>> GetTerminals(int scenarioId)
{
var filter = Builders<TerminalDto>.Filter.Eq(t => t.ScenarioId, scenarioId);
var dtos = (await this.collection.FindAsync(filter)).ToList();
}
}
我尝试搜索MongoDB官方文档,但找不到与存储TimeZoneInfo
相关的任何信息。
我该如何解决?
答案 0 :(得分:2)
您不应该将TimeZoneInfo
类序列化到文档中,而应该将.Id
属性序列化。有很多方法可以做到这一点,但是一种方法是使用“伙伴财产”,例如:
public class TerminalDto
{
// ... your other properties ...
public string TimeZoneId { get; set; }
[BsonIgnore]
public TimeZoneInfo TimeZone
{
get
{
return TimeZoneInfo.FindSystemTimeZoneById(this.TimeZoneId);
}
set
{
this.TimeZoneId = value.Id;
}
}
}