列挙型変更機能がないため、npgsql の列挙型配列に列挙型から int への変換を使用しています。
モデル:
public class TestEntity
{
public Guid Id { get; set; }
public TestEnum[] Enums { get; set; }
public TestEntity()
{
Enums = new TestEnum[0];
}
}
public enum TestEnum
{
NONE,
FIRST,
SECOND,
THIRD
}
環境:
public class TestContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TestEntity>()
.Property(x => x.Enums)
.HasConversion(
e => e.Cast<int>().ToArray(),
e => e.Cast<TestEnum>().ToArray());
}
}
LINQ 式で配列プロパティに「触れる」ことなくエンティティを DB から読み書きすると、すべてが完全に機能します。列は Postgres では integer[] 型であり、マッピングは正常に機能します。
ただし、enum[] プロパティで「Contains」関数を使用すると、InvalidCastException がスローされます。「ハンドラ タイプ Int32Handler で CLR タイプ Proj.TestEnum を書き込めません」。
例:
var param = TestEnum.FIRST;
var result = context.TestEntities!
.Where(x => x.Enums.Contains(param))
.ToArray();
足りないものはありますか?