TimeSpan 刻度在保存后获得 +1
TimeSpan ticks get +1 after save
我有一个关于 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:
我在测试中使用 Hans tip class 像这样:
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; }
}
}
它有效,但仍然很奇怪
我的重现尝试效果很好:
[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);
}
}
无论实际问题是什么:我需要一些帮助来重现它。 似乎 工作正常。
我的猜测是,字段 Time
被修改了不止一次(覆盖)。也许通过另一个线程。
为了确保,创建字段 readonly
并在构造函数中初始化一次,之后所有修改字段的尝试都将被编译器拒绝。
经过大量研究,我公司开发了一个 mysql 插件,在某些情况下可以做一些特殊的事情。很抱歉在这个问题上浪费了时间。
我有一个关于 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:
我在测试中使用 Hans tip class 像这样:
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; }
}
}
它有效,但仍然很奇怪
我的重现尝试效果很好:
[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);
}
}
无论实际问题是什么:我需要一些帮助来重现它。 似乎 工作正常。
我的猜测是,字段 Time
被修改了不止一次(覆盖)。也许通过另一个线程。
为了确保,创建字段 readonly
并在构造函数中初始化一次,之后所有修改字段的尝试都将被编译器拒绝。
经过大量研究,我公司开发了一个 mysql 插件,在某些情况下可以做一些特殊的事情。很抱歉在这个问题上浪费了时间。