質問: **背景:**私はORMとしてEntityFramework Coreを使用して、C#に変換する200以上のレガシーVB6アプリケーションを用意しています。残念ながら、多くのアプリはMySQLのゼロデイ`(0000-00-00)`利用しています。だから、私はこれに対応し、何らかの形でゼロの日付を格納できるようにする必要があります。 200以上のアプリで動作する基本的な方法を変更することは現在オプションではありません。 **セットアップ:** MySQLのフィールド定義を表すエンティティプロパティを定義できます。例: ``` public DateTime ExpiryDate { get; set; } ... entity.Property(e => e.ExpiryDate) .IsRequired() .HasColumnType("datetime") .HasDefaultValueSql("'0000-00-00 00:00:00'"); ``` 挿入時に値が送信されない場合、ゼロ日付が正しく格納されます。 **問題:** C#の日付が`0001-01-01`であるため、ゼロ日付を明示的に格納することはできません。だから私の質問は...データベースに出入りするゼロ日付を取得するためにエンティティを設定する方法はありますか? **これまでのところ** 、文字列として定義されたバッキングフィールドを使用して、 `DateTime.MinValue`を操作して`'0000-00-00'`にすることを試みました。これにより、ゼロデータを保存することができますが、データを取得しようとしたときにキャストの問題が発生します。 > System.InvalidCastException:タイプ 'System.DateTime'のオブジェクトをキャストして 'System.String'を入力できません。 > > 現在使用しているパッケージは次のとおりです: * EFCore 1.1 * PomeloEntityFrameWorkCore 1.1.2 * MySQL 5.7.18
回答: 人々はこれがコメントとしてより適していると主張するかもしれないが、基本的にそれは長い間待たなければならない。 そして: 私は手元にあるシステムを持っていないので少し助けなければならないので、私は頭の上からこれをやっています。 (と私は少し急いでいる) まず、マップされていないプロパティで開始します。 ``` [NotMapped] public DateTime ExpiryDate { get; set; } ``` このプロパティはマップされていません。モデルと一致しないデータベースに関するいくつかのエラーが発生する可能性がありますが、それを克服できます。このプロパティは、データを照会するときに自動的には入力されません。だから、私たちはこれに対処する方法が必要です。 たとえば、( **エンティティのどこかにコンテキストが必要なため、悪い例です** ): ``` [NotMapped] public DateTime? ExpiryDate { get { //of course you'll need some caching here var s = context.Database.SqlQuery("query to select datetime as string"); //additional logic to determine validity: if (s == "0000-00-00") return null; //else: //do the conversion } } ``` ここでの基本的な質問。あなたはEFフレームワーク内でこれをサポートするためにどれだけ遠くに行きたいですか? EFのチェンジトラッカーなどを使って読むだけでいいですか? たとえば、SQL自体の中でnvarcharにCASTを実行してデータを取得し、それを処理するなどの他の方法もあります。 おそらく、 `ModelBuilder`はいくつかの追加オプションを公開しています。