EF Core DB首先将PostgreSQL bit(1)列映射为BitArray,而不是bool



我正在与EF Core连接到现有的PostgreSQL数据库。有一个不可为null的标志列IsAvailable被定义为bit(1)。脚手架实体最终具有BitArray IsAvailable属性,而我预期它是bool。我尝试手动更改类型,但在查询数据时出现异常。

属性"Loan.IsAvailable"的类型为"bool",当前数据库提供程序不支持该类型。请更改属性CLR类型,或使用"[NotMapped]"特性或在"OnModelCreating"中使用"EntityTypeBuilder.ignore"忽略该属性。

我还尝试在字段上使用私有字段、[NotMapped]属性和[Column("is_available")]属性,但这也不起作用。以前有人遇到过这个问题吗?我该怎么办?

实体配置中的列定义

entity.Property(e => e.IsAvailable)
.IsRequired()
.HasColumnType("bit(1)")
.HasColumnName("is_available");

ValueConverters是我所需要的,我在官方文档中偶然发现了它们。

最终创建了一个我自己的转换类型。

转换器定义

public static class ConverterProvider
{
public static ValueConverter<bool, BitArray> GetBoolToBitArrayConverter()
{
return new ValueConverter<bool, BitArray>(
value => new BitArray(new[] { value }),
value => value.Get(0));
}
}

列映射

entity.Property(e => e.IsCurrent)
.IsRequired()
.HasColumnType("bit(1)")
.HasColumnName("is_current")
.HasConversion(ConverterProvider.GetBoolToBitArrayConverter());

并且我在我的实体中手动将属性交换为bool IsAvailable

如果无法将dB类型更改为boolean,则可以在c#中添加一个bool非映射属性作为位数组的代理。

[Column("is_available")]
public BitArray IsAvailableField {get;set;}
[NotMapped]
public boolean IsAvailable {
get {
return IsAvailableField[0];
}
set {
IsAvailableField[0] = value;
}
}

尽管这在djbobo的答案中是隐含的,但在这种情况下(如果可能的话)要考虑的第一个更改是将PostgreSQL数据库上的列变成boolean,它应该用于存储布尔数据。

这里有一个很好的解释:

https://dba.stackexchange.com/a/156851/123694

相关内容

  • 没有找到相关文章

最新更新