簡體   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