日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

ef mysql 时间_关于c#:EF6和MySQL时区支持

發(fā)布時(shí)間:2025/3/21 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ef mysql 时间_关于c#:EF6和MySQL时区支持 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我將日期時(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。