大したネタじゃないけども、すぐ忘れるので…。雑記です
何かしらのデータとローカルマシン内のデータへのファイルパスをDBで管理したい場面がありました。例えばですが、rowをC#で書くと以下みたいな感じです
class AudioFile { public string Title { get; set; } public string FilePath {get; set; } }
パスは文字列だからstring
でもいいのですが、存在チェックとかのためにFileInfo
になっていると嬉しいです(たぶん)。つまり以下のようにしたいです。
class AudioFile { public string Title { get; set; } public FileInfo File { get; set; } }
でもDBはFileInfo
なんて型は知らないし、EF6もよしなにしてくれないようです(定義済みのコンバータ)
ちなみに今回DBはMySQL 8.0.31を使っているとします。
HasConversionでコンバータを定義してあげる
DbContext
のOnModelCreating(ModelBuilder)
で変換を定義してあげる方法です。
public class Repository : DbContext { // コンストラクタとかは省略 public DbSet<AudioFile> AudioFiles => Set<AudioFile>(); protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<AudioFile>(builder => { builder .Property(a => a.File) .HasConversion(fileInfo => fileInfo.FullName, str => new FileInfo(str)); }) } }
とてもシンプル。ちなみにカラムの型はlongtext
になる
クラスにプロパティを書く
string FilePath
を参照してFileInfo
を返すプロパティを定義するだけでもよさそう
class AudioFile { public string Title { get; set; } public string FilePath {get; set; } private FileInfo? fileInfo = null; [NotMapped] public FileInfo File { get { if(fileInfo is null) fileinfo = new FileInfo(FilePath); return fileInfo } } }
まとめ
OnModelCreating
でHasConversion
を使って型変換を書ける- でもそもそもプロパティでもよさそう
- 存在確認なら
File.Exists(string)
でもいいので、string
で持っててもよさそう