Les ticks de TimeSpan obtiennent +1 après sauvegarde

c# dapper

Question

J'ai un problème avec Dapper, je ne sais pas comment résoudre ce problème:

J'ai un Poco comme ça:

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

Le champ Time est un MySQL 'TIME'. Si je charge une ligne avec Dapper avec un champ Time avec 1000 ticks par exemple et que je sauvegarde ce Poco sans rien changer, rechargez à nouveau la même ligne, le champ Time est maintenant à 1001 Ticks.

Qu'est-ce que je fais mal ?

MODIFIER :

Comment je charge ma ligne:

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

Comment je l'enregistre:

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

EDIT 2:

Un objet timespan avant sauvegarde:

{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

et après sauvegarde:

{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

Vous pouvez voir que Ticks 553440000000 et devenir 553450000000

EDIT 3:

J'utilise la pointe de Hans avec ma classe de test comme ceci:

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

et ça marche, mais c'est toujours étrange

Réponse acceptée

Après de nombreuses recherches, mon entreprise a développé un plug-in mysql dans certains cas. Désolé pour la perte de temps sur ce problème.


Réponse d'expert

Ma tentative de reproduire fonctionne 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);

    }
}

Quel que soit le problème, je vais avoir besoin d'aide pour le reproduire. Cela semble bien fonctionner.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi