ef mysql 时间_关于c#:EF6和MySQL时区支持
我將日期時間以UTC格式(使用DateTime.UtcNow)存儲在MySQL數(shù)據(jù)庫中。在對包含該日期的實體進行一些操作之后,它變得一團糟。
這是我定義表格的方式:
CREATE TABLE `gsrep`.`GlobalVersion` (
[..],
`CreationDate` TIMESTAMP NOT NULL,
`LastUpdateDate` TIMESTAMP NOT NULL,
[..]
);
我正在運行.NET 4.5.2框架,并使用Entity Framework 6和Database first原理映射了數(shù)據(jù)庫。
這是我在做什么:
第一步,創(chuàng)建對象:
var now = DateTime.UtcNow;
var globalVersion = new GlobalVersion
{
CreationDate = now,
LastUpdateDate = now
};
// saving the object
假設(shè)它是我國家的10:00 am,而我是GMT +2。創(chuàng)建的日期的Kind屬性設(shè)置為DateTimeKind.Utc,其值設(shè)置為08h00 am。在數(shù)據(jù)庫中,日期值為08:00 am。
一切順利。
第二步,獲取對象:
使用另一個連接,當我從數(shù)據(jù)庫中獲取對象時,日期設(shè)置為上午08:00,但其Kind屬性設(shè)置為DateTimeKind.Local。
這不是完全可以的,但是雖然我只讀取數(shù)據(jù),但這不是問題。我什至沒有注意到它,直到我需要更改一個日期。
更新一個日期:
一團糟。在一瞬間,我只需要更改一個日期。假設(shè)現(xiàn)在在我的國家/地區(qū)是11:00 am。
// getting the object
globalVersion.LastUpdateDate = DateTime.UtcNow;
// saving the object
保存后,LastUpdateDate在數(shù)據(jù)庫中設(shè)置為09:00 am(可以),但CreationDate現(xiàn)在設(shè)置為... 11:00 am。看起來它在DbContext.SaveChangesAsync()處設(shè)置為DateTime.Now(我說這是因為如果在調(diào)試期間在DateTime.UtcNow和SaveChangesAsync指令之間暫停,則CreationDate會設(shè)置為單擊繼續(xù)的那一刻)。
我的代碼中絕對沒有任何東西可以更改CreationDate ...在調(diào)用DbContext.SaveChangesAsync()之前,CreationDate具有不變的期望值。緊接著,CreationDate設(shè)置為我單擊"繼續(xù)"的那一刻(僅在數(shù)據(jù)庫中,在EF緩存中,該值仍然相同,但是在下一次連接時,如果將在數(shù)據(jù)庫中使用該值)。
我對這種行為完全迷失了……是什么原因引起的?
我正在SQLite數(shù)據(jù)庫中并行編寫相同的操作(我在連接字符串中將DateTimeKind設(shè)置為Utc,但沒有問題)。
根據(jù)您的描述,聽起來好像EF在檢索時忽略了mysql時間戳的UTC偏移,然后甚至更新了您未更改的字段。 可能的提示:stackoverflow.com/questions/6931014/
@joshp鏈接中提供的解決方案可修復(fù)DateTime.Kind,但在SaveChangesAsync期間仍會覆蓋CreationDate ...
哇...雖然我正在用此腳本創(chuàng)建表:
CREATE TABLE `gsrep`.`GlobalVersion` (
[..],
`CreationDate` TIMESTAMP NOT NULL,
`LastUpdateDate` TIMESTAMP NOT NULL,
[..]
);
MySQL Workbench(或MySQL?)實際上創(chuàng)建了一個這樣的表(使用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問題無關(guān)。 為了解決該問題,我遵循了joshp鏈接中提出的解決方案,但進行了一些改進。
總結(jié)
以上是生活随笔為你收集整理的ef mysql 时间_关于c#:EF6和MySQL时区支持的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java test 用法_Java的t
- 下一篇: datename mysql_SQL日期