具有 int 转换的 Npgsql 枚举数组在 "Contains" 上抛出 InvalidCastException
Npgsql enum array with int conversion throws InvalidCastException on "Contains"
由于缺少枚举更改功能,我在 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());
}
}
当我读取或写入实体 from/to 数据库时,没有“触及”LINQ 表达式中的数组属性,一切正常 - 列在 Postgres 中的类型为 integer[] 并且映射正常工作。
但是,当我在枚举 [] 属性 上使用“包含”函数时,它会抛出 InvalidCastException:“无法使用处理程序类型 Int32Handler 编写 CLR 类型 Proj.TestEnum”。
示例:
var param = TestEnum.FIRST;
var result = context.TestEntities!
.Where(x => x.Enums.Contains(param))
.ToArray();
有什么我遗漏的吗?
这是 this issue 的一种情况:使用值转换器会阻止方法转换。
如果使用 Npgsql 的本机枚举支持而不是进行值转换,这应该可以正常工作。你说你不想这样做是因为缺少枚举更改功能 - 你能更具体一点吗? PostgreSQL 确实支持添加和重命名枚举值,您可以在迁移中通过原始 SQL 来实现。
如果我没理解错的话,有2种解决方法
1.可以在where condition
前加上AsEnumerable()
var result = context.TestEntities!
AsEnumerable().Where(x => x.Enums.Contains(param))
.ToArray();
2。您可以从此 url
使用运算符重载
由于缺少枚举更改功能,我在 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());
}
}
当我读取或写入实体 from/to 数据库时,没有“触及”LINQ 表达式中的数组属性,一切正常 - 列在 Postgres 中的类型为 integer[] 并且映射正常工作。
但是,当我在枚举 [] 属性 上使用“包含”函数时,它会抛出 InvalidCastException:“无法使用处理程序类型 Int32Handler 编写 CLR 类型 Proj.TestEnum”。
示例:
var param = TestEnum.FIRST;
var result = context.TestEntities!
.Where(x => x.Enums.Contains(param))
.ToArray();
有什么我遗漏的吗?
这是 this issue 的一种情况:使用值转换器会阻止方法转换。
如果使用 Npgsql 的本机枚举支持而不是进行值转换,这应该可以正常工作。你说你不想这样做是因为缺少枚举更改功能 - 你能更具体一点吗? PostgreSQL 确实支持添加和重命名枚举值,您可以在迁移中通过原始 SQL 来实现。
如果我没理解错的话,有2种解决方法 1.可以在where condition
前加上AsEnumerable()var result = context.TestEntities!
AsEnumerable().Where(x => x.Enums.Contains(param))
.ToArray();
2。您可以从此 url
使用运算符重载