Los tics de TimeSpan obtienen +1 después de guardar

c# dapper

Pregunta

Tengo un problema con Dapper, no sé cómo solucionarlo:

Tengo un Poco como este:

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

El campo Tiempo es un 'TIEMPO' de MySQL. Si cargo una fila con Dapper con un campo Time con 1000 ticks, por ejemplo, y guardo este Poco sin cambiar nada, vuelva a cargar la misma fila, el campo Time está ahora en 1001 Ticks.

Qué estoy haciendo mal ?

EDITAR:

Cómo cargo mi fila:

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

Cómo lo guardo:

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

EDICION 2:

Un objeto de intervalo de tiempo antes de guardar:

{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

y después de guardar:

{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

Puede ver que Ticks 553440000000 y convertirse en 553450000000

EDIT 3:

Utilizo la sugerencia de Hans con mi clase de prueba de esta manera:

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

y funciona, pero sigue siendo extraño

Respuesta aceptada

Después de mucha investigación, hubo un plugin de mysql desarrollado por mi empresa que hacía algo especial en algunos casos. Perdón por la pérdida de tiempo en este tema.


Respuesta experta

Mi intento de repro funciona bien:

[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);

    }
}

Cualquiera que sea el problema real: voy a necesitar ayuda para reproducirlo. Parece que funciona bien.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué