EF核心:我可以使用.HasConversion()将SQL浮点数转换为C#十进制吗?

时间:2019-07-04 15:13:02

标签: c# sql-server asp.net-core entity-framework-core

我有各种现有的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));

1 个答案:

答案 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);