我有各种现有的SQL表,这些表具有保留价格的float
列,我需要将它们加载到C#decimal
属性中
在阅读了.HasConversion()
和.HasColumnType()
方法之后,我以为我可以读取一个SQL float (由于.HasColumnType()
和实习生,EF Core应该知道这是一个float将其转换为double
),然后使用.HasConversion()
方法将其转换为C#十进制;然后反之亦然。
我是否误解了或误用了这些方法?
上下文OnModelCreating
entity.Property(e => e.Price) // <-- decimal field
.IsRequired()
.HasColumnName("PREFIX-Price")
.HasColumnType("float")
.HasDefaultValueSql("((0))")
.HasConversion(
v => Decimal.ToDouble(v),
v => Convert.ToDecimal(v)
)
运行类似以下内容的
var x = myContext.TableName.Select(x => x.Price);
我收到以下异常:
InvalidCastException: Unable to cast object of type 'System.Double' to type 'System.Decimal'.
System.Data.SqlClient.SqlBuffer.get_Decimal()
System.Data.SqlClient.SqlDataReader.GetDecimal(int i)
lambda_method(Closure , DbDataReader )
Microsoft.EntityFrameworkCore.Storage.Internal.TypedRelationalValueBufferFactory.Create(DbDataReader dataReader)
我不希望它调用System.Data.SqlClient.SqlBuffer.get_Decimal()
,而是获取float / double。
最后,我能做我想做的事吗?
其他信息:
(尽管很明显),如果我要调用下面的代码,那么它可以正常工作,但这实际上并不可行,因为我/其他人可能会忘记或不意识到,加上工作量!
var x = myContext.TableName.Select(x => Convert.ToDecimal(x.Price));
答案 0 :(得分:0)
您将需要创建自己的Value Converter,如下所示:
var converter = new ValueConverter<decimal, double>(
v => (double)v,
v => (decimal)v
);
,然后在流畅的API配置中使用它:
modelBuilder
.Entity<EntityType>()
.Property(e => e.FeildName)
.HasConversion(converter);