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[] 属性上使用“包含”函数时,它会抛出 InvalidCastException:“无法使用处理程序类型 Int32Handler 编写 CLR 类型 Proj.TestEnum”。

例子:

var param = TestEnum.FIRST; 
            
var result = context.TestEntities!
    .Where(x => x.Enums.Contains(param))
    .ToArray();

有什么我想念的吗?

4

2 回答 2

0

这是这个问题的一种情况:使用值转换器阻止方法转换。

如果使用 Npgsql 的本机枚举支持而不是进行值转换,这应该可以正常工作。您说您不想这样做是因为缺少枚举更改功能-您能更具体吗?PostgreSQL 确实支持添加和重命名枚举值,您可以通过迁移中的原始 SQL 来做到这一点。

于 2019-12-27T14:20:20.730 回答
0

如果我理解正确,有 2 种解决方案 1. 您可以在 where 条件之前添加 AsEnumerable()

var result = context.TestEntities!
    AsEnumerable().Where(x => x.Enums.Contains(param))
    .ToArray();

2.您可以从此网址使用运算符重载

于 2019-12-27T14:43:16.660 回答