我有一個帶日期輸入文本框的表單。如果我提供日期一切都很好。如果我沒有提供日期(我將其保留爲空),則發送DateTime.min(1/1/0001)值。這將導致錯誤:一個DATETIME2數據類型爲datetime數據類型的轉換導致超出範圍的值如何避免空數據保存到數據庫時轉換爲DateTime.Min值?實體框架
我的日期屬性定義爲可空:
public Nullable<System.DateTime> InstallDate { get; set; }
我想要什麼如果我沒有提供日期,它將被寫入數據庫的空值。 我知道我可以在我的更新方法檢查1/1/0001併發送null,但是,我必須這樣做嗎? 有沒有辦法解決這個問題?感謝
編輯:
我解決了添加以下代碼到我的更新方法的問題:
tank.InstallDate = tank.InstallDate == DateTime.MinValue ? null : tank.InstallDate;
所以我的代碼如下所示:
public void UpdateTank(Tank tank)
{
using (RetailFuelEntities ctx = new RetailFuelEntities())
{
tank.InstallDate = tank.InstallDate == DateTime.MinValue ? null : tank.InstallDate;
ctx.Tanks.Attach(tank);
ctx.Entry(tank).State = EntityState.Modified;
ctx.SaveChanges();
}
}
這裏是我的ObjectDataSource:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetTank"
TypeName="DataAccess.Fuel.EF4.Tanks" DataObjectTypeName="DataAccess.Fuel.EF4.Tank"
DeleteMethod="DeleteTank" InsertMethod="InsertTank" UpdateMethod="UpdateTank">
<SelectParameters>
<asp:ControlParameter ControlID="TextBoxTankId" Name="TankId" PropertyName="Text"
Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
我不知道是否可以避免空檢查。
請提供更多代碼。這是來自EF的自動生成的屬性嗎?你從哪裏設置這個屬性,以及如何?嘗試從表單(WinForms,WPF?)到數據庫(列類型,允許爲空)遍歷整個路徑。 – 2012-02-14 16:51:09
該屬性由DbContext生成器生成。在我的SQL表中,InstallDate字段的類型爲:Shared.DateAndTime:smalldatetime。所以,在我的FormView中,我有TextBox,我應該提供安裝日期。我的問題是,一旦我點擊更新按鈕,如果我不把任何東西在文本框,我更新的方法(即接收對象正在更新)具有myObject.InstallDate等於DateTime.MinValue。我只是希望它是空的,不明白爲什麼它以這種方式轉換。 – bobetko 2012-02-14 17:21:33
確實沒有太多的代碼在這裏......有FormView控件,ObjectDataSource控件被設置(在我看來)適當進行選擇,更新,插入和刪除。更新,插入和刪除參數是FormView綁定的接收對象。除了Update方法,我沒有在DbContext生成器生成所有對象之後編寫任何自定義代碼。 – bobetko 2012-02-14 17:25:03