2011-08-11 20 views
1

我正在使用最新版本的Telerik MVC擴展,帶有Razor視圖引擎的ASP.NET MVC 3以及實體框架4.1代碼。實體框架如何處理值爲0001/01/01的日期

視圖模型:

public class EditGrantApplicationViewModel 
{ 
    // Other properties 

    public DateTime HospitalisedFromDate { get; set; } 
    public DateTime HospitalisedToDate { get; set; } 
} 

控制器的操作方法:

public ActionResult Create() 
{ 
    EditGrantApplicationViewModel viewModel = new EditGrantApplicationViewModel(); 

    return View(viewModel); 
} 

創建視圖:

<tr> 
    <td valign="top"><label>From:</label></td> 
    <td>@(Html.Telerik().DatePickerFor(x => x.HospitalisedFromDate) 
     .Name("HospitalisedFromDate") 
    )<br> 
     @Html.ValidationMessageFor(x => x.HospitalisedFromDate) 
    </td> 
    <td>&nbsp;</td> 
    <td valign="top"><label>To:</label></td> 
    <td>@(Html.Telerik().DatePickerFor(x => x.HospitalisedToDate) 
     .Name("HospitalisedToDate") 
    )<br> 
     @Html.ValidationMessageFor(x => x.HospitalisedToDate) 
    </td> 
</tr> 

格蘭特應用程序類:

public class GrantApplication 
{ 
    // Other properties 

    public DateTime HospitalisedFromDate { get; set; } 
    public DateTime HospitalisedToDate { get; set; } 
} 

語境:

public class HbfContext : DbContext 
{ 
    public DbSet<Bank> Banks { get; set; } 
    public DbSet<AccountType> AccountTypes { get; set; } 
    public DbSet<GrantApplication> GrantApplications { get; set; } 
    public DbSet<AuditEntry> AuditEntries { get; set; } 
} 

交付申請表:

HospitalisedFromDate datetime null 
HospitalisedToDate datetime null 

我有幾個關於日期的問題,以及如何EF 4.1代碼先處理日期。

第一次加載視圖時,HospitalisedFromDate和HospitalisedToDate初始化爲0001/01/01。我不必選擇日期。所以如果沒有選擇,那麼它會嘗試並將0001/01/01插入到我的數據庫表中。這是當我得到一個錯誤:

將datetime2數據類型轉換爲日期時間數據類型導致超出範圍的值。\ r \ n該語句已被終止。

我該如何解決這個問題,如果沒有選擇任何內容,它會向表列添加NULL值?

+2

嘗試使用可空日期而不是'DateTime?''public DateTime? HospitalisedFromDate {get;組; }' –

回答

3

我假設你知道這個的原因是因爲SqlDateTime min值和c#datetime min值不同。有在C#中爲空的日期時間聲明它像

public class EditGrantApplicationViewModel 
{ 
    // Other properties 

    public DateTime? HospitalisedFromDate { get; set; } 
    public DateTime? HospitalisedToDate { get; set; } 
} 

通過這樣的屬性的默認值現在爲空

編輯:只是爲了更多信息聲明一樣,是一個可空相當於宣佈它爲

public class EditGrantApplicationViewModel 
{ 
    // Other properties 

    public Nullable<DateTime> HospitalisedFromDate { get; set; } 
    public Nullable<DateTime> HospitalisedToDate { get; set; } 
} 
+0

是的。實體框架不應該知道它是否應該將其添加爲null的最小日期?這是唯一的方法嗎? –

+0

多數民衆贊成在EF本地執行它的唯一方法,並將其設置爲數據庫中的空值,我認爲,沒有添加自己的邏輯保存切換DateTime.MinValue SqlDateTime.MinValue或DBNull – Manatherin

+0

什麼是最佳實踐?你的方式?如果我使用SqlDateTime.MinValue進行設置,它會在數據庫中添加null嗎? –