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