我正在与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