2013-03-06 10 views
18

エンティティフレームワークDbContextdatetime2にグローバルに設定することは可能ですか?コードファーストモデルを使用する場合はSystem.DateTimeです。エンティティフレームワーク5がdatetime2データ型を使用するようにする

HasColumnType()メソッドを使用して各列に対してこれを行うことができますが、既存のコードベースではグローバルソリューションが必要です。

+0

なぜこれをやりたいのか不思議です。私が尋ねる理由は、nullableでないDateTime列(DateTime.MinVal)の既定値を持つエンティティをコミットしようとすると、非常に一般的なエラーです。例外は、DateTime2列を使用する必要があることを示していますが、実際に余分な精度が必要な場合を除き、ほとんど誤解を招きます。この問題を解決するには、DateTimeフィールドにデフォルト以外の値を割り当てるか、またはNULL値として定義します。お役に立てれば。 –

+0

@ w.brian 1)私たちは、1753年より前に生まれた/生まれていない芸術家と作家の作品を保存したテーブルを持っています... 2)これが可能ならば、フィールド。 3)技術的な好奇心... –

+0

ガッチャ。上記の例外に遭遇したときに私が当初行ったように間違ったツリーを吠えていないことを確認したかっただけです。 –

答えて

25

EF6はかなり長い間使われていましたが、この質問は引き続き検索で表示されるため、SQLの型を設定するためにカスタム規約を使用する方法があります。 DbContextクラスのOnModelCreatingメソッド内では、次のようにします。

modelBuilder.Properties<DateTime>() 
    .Configure(c => c.HasColumnType("datetime2")); 
+0

新しいモーダル専用ですか? Update-Databaseでこのエラーメッセージが表示されたためです。ALTER TABLE ALTER COLUMN 1つ以上のオブジェクトがこの列にアクセスしたため、日付に失敗しました。 – Jacob

+1

@Jacobモデルのデータベースをすでに作成している場合は、それは機能するのでしょうか?そうですが、OnModelCreatingに規約を追加した後で移行を作成することを忘れないでください。これは私がそれを行った方法です。そうすれば正常に動作することが分かります:) –

+1

テーブルの制約の結果としてエラーが発生しました。私はこの答えに従って手動で削除することで解決しました:https://stackoverflow.com/a/19461205/665783しかし、あなたの答えは私たちを大いに助けました。私たちはDB全体をあなたが投稿したコードで移行しました。ありがとうございました! – Jacob

7

EF5ではなくEF6(現時点ではアルファベット版)はcustom conventionsでこれを許可しています。 EF5の場合、リフレクションに基づいてモデルビルダーにHasColumnType呼び出しを追加するリフレクションに基づいたカスタムコンベンションベースのフレームワークが必要です(例:EF Code First Extras)(プラグイン可能な規約をサポートすると主張しています)。

関連する問題