保存后TimeSpan滴答获得+1

时间:2015-12-23 15:37:53

标签: c# dapper

我有一个小巧玲珑的问题,我不知道如何解决这个问题:

我有一个像这样的Poco:

public class Test
{
    public long Id { get; set; }
    public TimeSpan? Time { get; set; }
}

字段时间是MySQL' TIME'。 例如,如果我使用带有1000个刻度的时间字段加载Dapper的行,并且我保存此Poco而不进行任何更改,请重新加载同一行,时间字段现在为1001刻度。

我做错了什么?

编辑:

我如何加载我的行:

var testobj = Db.Query<Test>("select * from Test where Id = @id", new {id = Id});

我如何保存它:

Db.Execute("replace into Test values (@Id,@Time)", testObj);

编辑2:

保存前的时间跨度对象:

{15:22:24}
    Days: 0
    Hours: 15
    Milliseconds: 0
    Minutes: 22
    Seconds: 24
    Ticks: 553440000000
    TotalDays: 0.64055555555555554
    TotalHours: 15.373333333333333
    TotalMilliseconds: 55344000.0
    TotalMinutes: 922.4
    TotalSeconds: 55344.0

并保存后:

{15:22:25}
    Days: 0
    Hours: 15
    Milliseconds: 0
    Minutes: 22
    Seconds: 25
    Ticks: 553450000000
    TotalDays: 0.64056712962962958
    TotalHours: 15.37361111111111
    TotalMilliseconds: 55345000.0
    TotalMinutes: 922.41666666666674
    TotalSeconds: 55345.0

你可以看到Ticks 553440000000并成为553450000000

编辑3:

我在我的Test类中使用Hans tip,如下所示:

public class Test
{
    public long Id { get; set; }
    private TimeSpan? _time;

    public TimeSpan? Time
    {
        get
        {
            if (_time.HasValue)
                return TimeSpan.FromTicks((long)Math.Floor(_time.Value.Ticks / 100000000d) * 100000000);
            return _time;
        }
        set { _time = value; }
    }
}

它有效,但它还很奇怪

3 个答案:

答案 0 :(得分:1)

经过大量研究,我的公司开发了一个mysql插件,在某些情况下做了一些特别的事情。很抱歉在这个问题上浪费了时间。

答案 1 :(得分:0)

我的重新尝试工作正常:

[FactMySql]
public void Issue426_SO34439033_DateTimeGainsTicks()
{
    using (var conn = GetMySqlConnection())
    {
        try { conn.Execute("drop table Issue426_Test"); } catch { }
        try { conn.Execute("create table Issue426_Test (Id int not null, Time time not null)"); } catch { }
        const long ticks = 553440000000;
        const int Id = 426;

        var localObj = new Issue426_Test
        {
            Id = Id,
            Time = TimeSpan.FromTicks(ticks) // from code example
        };
        conn.Execute("replace into Issue426_Test values (@Id,@Time)", localObj);

        var dbObj = conn.Query<Issue426_Test>("select * from Issue426_Test where Id = @id", new { id = Id }).Single();
        dbObj.Id.IsEqualTo(Id);
        dbObj.Time.Value.Ticks.IsEqualTo(ticks);

    }
}

无论实际问题是什么:我需要一些帮助来重现它。 似乎可以正常工作。

答案 2 :(得分:0)

我的猜测是,字段Time被多次修改(覆盖)。也许是另一个线程。

要确保,请在构造函数中创建字段readonly并将其初始化一次,编译器将拒绝以下所有修改字段的尝试。