2012-02-14 3 views
0

日付入力用のテキストボックスを持つフォームがあります。もし私が日付を提供すれば、すべてが大丈夫です。日付を指定しない場合(空のままにする)、DateTime.min(1/1/0001)の値が送信されます。そして、これが原因エラー:datetimeデータ型へのDATETIME2データ型の変換がデータベースに保存するときに空の日付がDateTime.Min値に変換されないようにするにはどうすればよいですか?エンティティフレームワーク

私の日付プロパティがnullとして定義されている範囲外の値になった:私が欲しいもの

public Nullable<System.DateTime> InstallDate { get; set; } 

私が日付を提供しない場合、データベースに書き込まれるNULL値です。 更新方法で1/1/0001をチェックしてヌルを送ることができますが、それを行う必要はありますか? この問題を回避する方法はありますか?おかげ

編集:私は私の更新メソッドに以下のコードを追加し、問題を解決し

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> 

ヌルチェックを避けることができるのだろうかと思います。

+0

もっとコードを入力してください。これはEFの自動生成プロパティですか?どこからこのプロパティを設定し、どのように設定しますか?フォーム(WinForms、WPF?)からデータベース(列の型、nullは許可されていますか?)に質問の全体のルートを走査してみてください。 –

+0

このプロパティはDbContextジェネレータによって生成されます。私のSQLテーブルでは、InstallDateフィールドはタイプ:Shared.DateAndTime:smalldatetimeです。 FormViewでは、Install Dateを提供するはずのTextBoxがあります。私の問題は、Updateボタンをクリックすると、テキストボックスに何も置かないと、Updateメソッド(オブジェクトが更新される)がDateTime.MinValueと等しいmyObject.InstallDateになります。私はそれをnullにして、それがなぜこのように変換されるのか理解していないだけです。 – bobetko

+0

実際にはあまりコードがありません...私の意見では、選択、更新、挿入、削除を実行するために正しく設定されたFormView、ObjectDataSourceがあります。パラメータのUpdate、Insert、Deleteは、FormViewがバインドされているオブジェクトを受け取ります。 Updateメソッドを除いて、私はDbContextジェネレータがすべてのオブジェクトを生成した後にカスタムコードを書きませんでした。 – bobetko

答えて

2

問題は、UIコントロール(FormView)が空の文字列をnullに変換せず、代わりにDateTime.MinValueに変更することです。あなたの財産は、結局のところ有効な日付なので、この値をうれしく受け入れます。

溶液はhereです。基本的には、このケース専用のパラメータ属性があり、ConvertEmptyStringToNullと呼ばれています。

+0

私はあなたが言っていることを見る。私の場合、Updateメソッドはオブジェクトをパラメータとして受け取るので、UpdateParameters内​​で必要なものを指定することはできません(または、わからない)。私はこれを試して、もちろん無視されました: FormView全体に適用可能な一般的なConvertEmptyStringToNullプロパティを期待していました。ありがとう。 – bobetko

+0

さて、この記事もあります。ObjectDataSourceの 'ConvertNullToDBNul'の設定についてはhttp://www.donkitchen.com/2007/07/15/formview-and-objectdatasource-with-nullable-types/で触れています。 –

関連する問題