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フォルダに自動生成されているようだ。)






Users Today : 39
Users Yesterday : 44
Users Last 7 days : 182
Users Last 30 days : 963
Users This Month : 842
Users This Year : 15668
Total Users : 93472
Views Today : 50
Views Yesterday : 53
Views Last 7 days : 232
Views Last 30 days : 1223
Views This Month : 1050
Views This Year : 21255
Total views : 131190
Who's Online : 0
Migration時にはMigrationフォルダにマッピングが定義されたコードが作成されるようです。