2016-11-03 52 views
1

我想將CreatedDate列設置爲每當一個新行插入當前日期時間,所以我做了這樣的:EF:可以使用默認值作爲創建的日期屬性嗎?

public DateTime CreateDate { get; set; } = DateTime.Now; 

我測試,它工作得很好,這是一個實用的方法?我看到很多文章用這麼多的代碼和流利的API實現相同,沒有人提到這個簡單的方法?

+3

您可能遇到的一個問題是,這個時間將根據應用程序服務器的運行位置生成。如果你有用戶交互,並想反映用戶在這個時區的時區將不起作用。不知道你的應用程序,但這對你來說可能不是問題。 –

回答

3

這取決於你想完成什麼。

我看到很多文章達到同樣有這麼多的代碼,用流利的API,

大多數這些條款將是大約在數據庫級別添加默認值。你沒有那樣做。如果使用普通SQL在表中插入一行,並且不指定CreatedDate的值,則會出現錯誤。

隨着你在做什麼,在插入時總是需要在SQL中指定CreatedDate。但實體框架插入時始終在SQL中指定它,並完全忽略在數據庫級別設置的任何默認值。

所以,如果這就是你想要的 - 默認值只適用於通過C#創建對象時 - 那麼你在做什麼是完全沒問題的。它也可以寫成從類的構造函數中設置值。

@Alex Kozlowski提出了一個很好的評論,這是DateTime.Now可能不是你期望插入的值。這取決於哪個系統正在運行代碼。時區可能與您的服務器不同,或時鐘可能不同步。

+0

如何避免這種「服務器時間衝突」問題? –

+1

@MohamedAhmed您可以通過以UTC保存所有時間來避免不同的時區,但時鐘關閉是一種無法可靠防止的情況,而不是讓一臺專用服務器(通常是數據庫服務器)檢索時間。並且爲了使EF能夠很好地運行,您可以準確地掌握您現在要避免的數據庫級默認設置。 – hvd

1

是的。此功能是在c#版本6以後添加的。這將只從c#-6開始工作。這就是爲什麼你不會在很多文章中找到它的原因。