0

列挙型変更機能がないため、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();

足りないものはありますか?

4

2 に答える 2