无法从MongoDB文档中读取TimeZoneInfo

时间:2018-10-15 10:23:58

标签: c# mongodb timezone mongodb-query

我有一个包含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相关的任何信息。

我该如何解决?

1 个答案:

答案 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;
        }
    }
}