2015-12-23 10 views
5

Ho un problema con Dapper, non so come risolvere questo problema:TimeSpan zecche ottenere uno dopo salvataggio

Ho un Poco come questo:

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

Il Tempo è un campo MySQL 'TIME'. Se carico una riga con Dapper con un campo Time con 1000 ticks ad esempio, e salvo questo Poco senza cambiare nulla, ricarico nuovamente la stessa riga, il campo Time ora è 1001 Ticks.

Cosa sto sbagliando?

EDIT:

Come posso caricare la mia fila:

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

Come salvarlo:

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

EDIT 2:

Un oggetto periodo prima di salvare:

{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 

e dopo Risparmi:

{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 

Si può vedere che le zecche 553.440.000.000 e diventare 553450000000

EDIT 3:

Io uso Hans punta con la mia classe di test in questo modo:

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

e funziona, ma è ancora strano

+1

Come si carica l'ora? –

+0

@ FᴀʀʜᴀɴAɴᴀᴍ Ho aggiornato la mia domanda – Baptiste

+0

scusa non capisco, la riga è caricata con Id = 1 e Tempo = 1000 tick, salvo questa riga, la ricarica, e ora Time = 1001 Ticks – Baptiste

risposta

1

Dopo molte ricerche, c'è stato un plugin mysql sviluppato dalla mia azienda che ha fatto qualcosa di speciale in alcuni casi. Ci scusiamo per la perdita di tempo su questo problema.

+0

Il mio tipo preferito di "bug" - quello in cui non eseguo tutti devono fare qualcosa (tranne un rapido tentativo di riproduzione), ma in qualche modo risultano utili per prendersi il tempo, p Felice di aver trovato il problema. –

0

Il mio tentativo di Repro funziona bene:

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

    } 
} 

Qualunque sia il problema reale è: ho intenzione di bisogno di aiuto per riprodurlo. Lo sembra funzionare allo.

+0

Ho alcune notizie, sembra che succeda con il database dei clienti con cui lavoro, se creo la stessa tabella, inserisco la stessa linea su un altro schema, funziona. Io davvero non capisco. – Baptiste

+0

@Baptiste e sei sicuro al 100% circa il tipo di colonna nella tabella del database esistente? –

0

Suppongo che il campo Time venga modificato più volte (sovrascritto). Forse da un altro thread.

Per assicurarsi, creare il campo readonly e inizializzarlo una volta nel costruttore e tutti i seguenti tentativi di modifica del campo verranno rifiutati dal compilatore.

+0

Non penso, perché dopo aver salvato l'oggetto, l'oggetto TimeSpan è ancora buono, ma nel database ho +1 secondo .. – Baptiste

+0

@Baptiste Hai verificato con il campo 'readonly'? –

+0

Non puoi impostare un campo di sola lettura, dapper non può impostare il valore quando legge la riga e mapparla su un oggetto – Baptiste