23

我有一個使用EF 4.1和代碼優先的方法使用SQL Compact 4.0數據庫的Windows應用程序。使用EF4轉換爲日期時發生溢出

public class Quotation 
{ 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public DateTime DateCreated { get; set; } 

    public ContactPerson ContactPersonAssigned { get; set; } 

    public string OurReference { get; set; } 

    public string QuotationDataString { get; set; } 
} 

,我讀了這一點: 我不能,因爲我發現了一個異常的對象保存到數據庫中,與內部異常 試圖保存的文件類型報價時 「在轉換成datetime時發生溢出」錯誤可能是由於我的應用程序設置和sql compact數據庫設置之間關於轉換日期不匹配所致。 我不太確定,因爲我的sdf數據庫文件有一個正確命名爲「DateCreated」,不可爲空且類型爲「datetime」的字段。

我是SQL compact新手。你能幫我調試這個問題嗎?

+3

您是否在您的應用程序中將DateCreated設置爲DateTime.Now? –

+1

我犯了一個愚蠢的錯誤。代碼中的某處DateCreated爲空。 – Francesco

+2

你能以一種能夠幫助他人的方式回答你自己的問題嗎?如果你這樣做,你可以選擇你的正確答案。這看起來很奇怪,但它是處理這種情況的首選方式。 – Will

回答

87

如果您的模型具有DateTime類型的非空值屬性,則當您發佈該屬性爲空值的表單時,它會自動設置爲.net 01/01/0001(DateTime.MinValue on MSDN)中的DateTime.MinValue。 (作爲一個方面說明,你可以通過爲DateTime實現你自己的IModelBinder來改變這種行爲,如果嘗試值爲空/空並且屬性不可爲空,則可以拋出驗證異常)。

如果您嘗試保存值(DateTime.MinValue)到數據庫中,你會得到轉換錯誤,如果數據庫字段是SQL datetime類型的,因爲.NET DateTime.MinValue小於SQL日期時間MINVALUE(1753年1月1日)因此無法轉換爲sql值。 (SQL datetime min value on MSDN

如果DATETIME2用於該字段上的MS SQL Server的新版本,其具有數據類型DATETIME2允許從01/01/0001到31/12/9999(SQL datetime2 on MSDN)值將不會發生此錯誤( , 當然)。

+6

看到這樣的好答案不被接受,真讓人遺憾。 –

+0

謝謝。很好的答案 –

1

這是一個老問題...但也許有人能有所幫助:

我解決了這個問題(MVC4,EF5,SqlServerCE 4.0),使用以下定義:

public DateTime? DateFrom { get; set; } 
public DateTime? DateTo { get; set; } 

玩得開心!

1

我討厭同樣的問題,最初在對象上保存datetime的原因是null。

確保在將對象保存到本地CE數據庫之前已經分配了實際的日期時間。