2015-12-14 69 views
0

我很努力,爲什麼我的DateTime被錯誤地保存到我的數據庫中。DateTime被錯誤地保存到我的數據庫中

我通過它的價值20/12/2015(字符串)旁邊的格式(dd/MM/yyyy),並將其解析爲DateTime但它總是保存到我的SQL Server數據庫作爲06/12/2015

public ActionResult SaveSettings(ProjectPlan projectPlan) 
{ 
    projectPlan.StartDate = DateTime.ParseExact(projectPlan.ShortDateTime, projectPlan.DateFormat, null); //ShortDateTime is 20/12/2015, DateFormat is dd/MM/yyyy 
    var plan = this._dc.ProjectPlans.Single(a => a.Id == projectPlan.Id); 
    plan = projectPlan; 
    this._dc.SaveChanges(); 
} 
+5

設置'StartDate'後放置一個斷點。它在那裏設置正確嗎?如果確實是數據庫存儲問題,或者字符串中出現錯誤的反序列化,那可能會縮小範圍。 – krillgar

+0

@krillgar,直到我調用SaveChanges()的時候,日期時間就是你想要的(20/12/2015) – MyDaftQuestions

+1

你的數據庫中datetime的格式是什麼,你可以仔細檢查一下 – MethodMan

回答

6

呃,沒有你的意思是更新實體的StartDate屬性,然後將其保存到數據庫:

public ActionResult SaveSettings(ProjectPlan projectPlan) 
{ 
    var plan = this._dc.ProjectPlans.Single(a => a.Id == projectPlan.Id); 
    plan.StartDate = DateTime.ParseExact(projectPlan.ShortDateTime, projectPlan.DateFormat, null); 
    this._dc.SaveChanges(); 
} 

在這行你基本上是殺EF知道的每個環境:

plan = projectPlan; 

因此,如果您查看針對您的SQL數據庫生成的實際SQL查詢,您將會注意到正好有0行被更新。

+0

爲什麼會這麼做:(我的意思是,我使用EF創建了一個對象,並且它跟蹤了變化,所以如果我改變一個屬性或者只是改變pbject的引用,這有什麼關係嗎? – MyDaftQuestions

+0

是的,但基本上在你的代碼示例中,通過從數據庫中獲取'plan'變量,並在下一行中將您的行爲參數中的一個參考完全替換爲此參考。 –

+0

我剛剛測試過它,它是關於參考:(。我做'plan.Prop = proejctPlan.Prop'和plan.Prop2 = projectPlan.Prop2'它的工作原理!:s – MyDaftQuestions

2

的文字表述是不存儲在服務器中,當您有DateTime對象時,它也不在.NET中。這只是一個很大的數字,從設定的時間計算「ticks」的數量。

您將需要格式化日期,當您選擇返回到字符串的日期時,插入方不能控制它(除非插入方也存儲格式化字符串,或者您不將它存儲爲日期,而不是將其存儲爲一個字符串)