繁体   English   中英

EF6和MySQL时区支持

[英]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 6Database first原则映射了数据库。

这是我在做什么:

第一步,创建对象:

var now = DateTime.UtcNow;
var globalVersion = new GlobalVersion
{
    CreationDate = now,
    LastUpdateDate = now
};
// saving the object

假设我的国家/地区是10:00 amGMT +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.UtcNowSaveChangesAsync指令之间暂停,则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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM