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
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.
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.