[英]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.