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

EF Core DB first mapping PostgreSQL bit(1) column as BitArray instead of bool

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

The property 'Loan.IsAvailable' is of type 'bool' which is not supported by the current database provider. Either change the property CLR type or ignore the property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

我也试过玩弄私人领域,[NotMapped] 属性 和领域的 [Column("is_available")] 属性,但这也不起作用。有没有人遇到过这个问题?我该怎么办?

实体配置中的列定义

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

如果您不能将 dB 类型更改为布尔值,您可以在 c# 中添加一个布尔非映射 属性 作为位数组的代理。

[Column("is_available")]
public BitArray IsAvailableField {get;set;}

[NotMapped]
public boolean IsAvailable {
  get {
    return IsAvailableField[0];
  }
  set {
    IsAvailableField[0] = value;
  }
}

ValueConverters 是我需要的,我在 the official docs.

中偶然发现了它们

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

转换器定义

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