EntityFramework上でのSqlite DateTimeの扱い

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

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。
カテゴリー: C#, dotnetcore, Entity Framework, 技術系 パーマリンク

EntityFramework上でのSqlite DateTimeの扱い への1件のフィードバック

  1. takezou のコメント:

    Migration時にはMigrationフォルダにマッピングが定義されたコードが作成されるようです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください