SQLiteでは、日付型というものは基本的に存在しない。
SQLのCREATE TABLE中で型としてDATETIMEを指定しても、内部的にはBinaryとなってしまい、Scaffoldした場合はbyte[]として変換されてしまう。
Entity Frameworkで、コードファーストを使用して、DateTime型のプロパティをマイグレーションすると、SQLite上にはTEXT型として作成され、自動的に相互変換をかけるように設定してくれる。
ただ、データファーストで、Scaffoldをかけた場合、TEXT型のカラムから作成されるエンティティ中のプロパティはstring型になってしまう。
TEXT型だが、内容はDateTimとして扱いたい場合は、DbContextから派生させたクラス中で、OnModelCreatingメソッドをオーバーライドして、データ変換をかけることで解決できる。
例えば、前述の日時を格納するTEXT型のカラムをDateTimeとして扱いたければ、以下のようなコードを書いておけば良い。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyTable>(entity =>
{
entity.ToTable("MyTable");
entity.Property(e => e.PostedTime)
.HasColumnType("TEXT")
.HasColumnName("PostedTime")
.HasConversion<DateTime>();
});
OnModelCreatingPartial(modelBuilder);
}
これにより、MyTableテーブルのPostedTimeはDB上にはTEXT型として保存され、読み出し時にはDateTimeに変換されるようになる。
SQLiteの場合、MigrationとScaffoldで結果が違うので、どうすればいいかなと調べてみた。(ちなみに、Migration時に自動的に変換定義している模様。Migrationフォルダに自動生成されているようだ。)
Migration時にはMigrationフォルダにマッピングが定義されたコードが作成されるようです。