2012-05-04 8 views
4

私は小さなMVC4アプリケーションを作成し、ローカルSQL 2012サーバーでデータベースを作成しました。私の2012年のデータが、SQL 2008のプロダクションとして私の安価な共有ホストに移されたことを「インポート」しました。 aspmembership以外のテーブルにいくつかの変更を加え、sql 2008からテーブルを削除して再インポートしました。私はアカウントを登録しようとした場合 は、何らかの理由で私は、このエラーにdatetime2データ型をsmalldatetimeデータ型に変換すると、範囲外の値が返されました。 r nステートメントが終了しました

The conversion of a datetime2 data type to a smalldatetime data type resulted in an out-of-range value.\r\nThe statement has been terminated 

を取得できません。私はすべてのsmalldatetimecolumnsのdatetime2列にchaningしようとしましたが、smalldatetimesがないのに何らかの理由で同じエラーが発生しますか?

誰にもアイデアはありますか?ありがとうございました。

編集:未来の人々 - 私はこれがなぜ修正されたのか不明ですが、SQL 2012の代わりにSQL Express 2008のテーブルを再作成し、それらを移動しました。うまく働いた。

+0

これらは関連するようです:http://stackoverflow.com/questions/655745/what-is-datetime2 and http://stackoverflow.com/questions/4608734/the-conversion-of-a-datetime2-data-type -to-a-datetime-data-type-in​​-o – daryal

+0

日付が魔法の年の「1753」の前であるため、「smalldatetime」で失敗したようですが、これを引き起こす値を確認できますか? – V4Vendetta

+5

日付の範囲[smalldatetime](http://msdn.microsoft.com/en-us/library/ms182418.aspx?ppud=4)の場合、1900-01-01から2079-06-06、[datetime2](http ://msdn.microsoft。com/ja-us/library/bb677335.aspx)は、0001-01-01から9999-12-31です。あなたの値が 'smalldatetime'の範囲外にあるかどうかを確認してください。 'smalldatetime'変数を使うストアドプロシージャや関数、あるいは' smalldatetime'パラメータを持っていますか? –

答えて

9

エラーの外観から、データベースは日付型としてSmallDateTimeを使用しています。その最小値は1900年1月1日です。あなたの実体を仮定するとあなたのGameTime値がNULL可能ではないので、あなたはそれのために任意の値を設定していないとき、それは常に0000-JAN-01であるDateTime.Minなります

public class Game 
    { 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid GameId { get; set; } 

    [Required] 
    public DateTime GameTime { get; set; } 
    } 

を下回るようなものです。これはSmallDateTimeの範囲外ですが、DateTime2の範囲内です。したがって、EFはDateTime2 SQL型をSQLサーバーに渡そうとします。あなたのデータベースはSmallDateTimeを使用しているので、質問にエラーが表示されます。問題を解決するには

、あなたは私が考えることができるオプション次き:

  • をフィールドnullalbeを作ります。

  • またはSQLサーバー

  • やデータベースを作成するときにDATETIME2データ型を使用するようにEFを強制的にDATETIME2に日付タイプを変更(あなたの入力日付はSMALLDATETIMEの範囲内にある場合。常にチェックする必要があり)。コードは以下のようになります。 (あなたのコンテキストクラスの内部で。この方法は、必要があります)


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity() 
      .Property(t => t.GameTime) 
      .HasColumnType("datetime2"); 
    } 
  • アプリケーションでSMALLDATETIMEに一致するようにmin値あなたのDateTimeプロパティを設定するには、コンバータのヘルパーを書きます。

  • DateTime2(アプリケーション終了からdatetime2)をsmalldatetimeに変換するためのトリガーをデータベースに書き込みます。

うまくいけば、私はあなたの質問を正しく理解しており、私の答えが役立ちます。

関連する問題