[英]EF6 and MySQL timezone support
我将日期时间以UTC格式(使用DateTime.UtcNow
)存储在MySQL数据库中。 在对包含该日期的实体进行一些操作之后,它变得一团糟。
这是我定义表格的方式:
CREATE TABLE `gsrep`.`GlobalVersion` (
[..],
`CreationDate` TIMESTAMP NOT NULL,
`LastUpdateDate` TIMESTAMP NOT NULL,
[..]
);
我正在运行.NET 4.5.2框架,并使用Entity Framework 6
和Database first
原则映射了数据库。
这是我在做什么:
第一步,创建对象:
var now = DateTime.UtcNow;
var globalVersion = new GlobalVersion
{
CreationDate = now,
LastUpdateDate = now
};
// saving the object
假设我的国家/地区是10:00 am
, GMT +2
。 创建的日期将其Kind
属性设置为DateTimeKind.Utc
并将其值设置为08h00 am。 在数据库中,日期值为08:00 am。
一切顺利。
第二步,获取对象:
使用另一个连接,当我从数据库中获取对象时,日期设置为上午08:00,但其Kind属性设置为DateTimeKind.Local。
这不是完全可以的,但是虽然我只读取数据,但这不是问题。 我什至没有注意到它,直到我需要更改一个日期。
更新一个日期:
一团糟。 在一瞬间,我只需要更改一个日期。 假设现在11:00 am
我国家的11:00 am
。
// getting the object
globalVersion.LastUpdateDate = DateTime.UtcNow;
// saving the object
保存后, LastUpdateDate
在数据库中设置为09:00 am
(可以),但是CreationDate
现在设置为... 11:00 am
。 它看起来像是在DbContext.SaveChangesAsync()
处设置为DateTime.Now
(我说这是因为,如果在调试期间在DateTime.UtcNow
和SaveChangesAsync
指令之间暂停,则CreationDate会设置为我单击继续的那一刻)。
在我的代码中,绝对没有任何东西可以更改CreationDate ...在调用DbContext.SaveChangesAsync()
, CreationDate
具有不变的期望值。 紧接着, CreationDate
设置为我单击“继续”的那一刻(仅在数据库中,在EF高速缓存中,该值仍然相同,但是在下一次连接时,如果将在数据库中使用该值)。
我对这种行为完全迷失了……是什么原因引起的?
我正在SQLite数据库中并行编写相同的操作(我在连接字符串中将DateTimeKind
设置为Utc
,但没有问题)。
哇...虽然我正在用此脚本创建表:
CREATE TABLE `gsrep`.`GlobalVersion` (
[..],
`CreationDate` TIMESTAMP NOT NULL,
`LastUpdateDate` TIMESTAMP NOT NULL,
[..]
);
MySQL Workbench(或MySQL?)实际上创建了一个这样的表(使用MySQL Workbench逆向工程获取它):
CREATE TABLE `GlobalVersion` (
[..],
`CreationDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`LastUpdateDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
[..]
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
实体框架自己更新CreationDate毫无意义。 最后,这与DateTimeKind
问题无关。 为了解决这个问题,我遵循了joshp链接中提出的解决方案,但进行了一些改进 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.