У меня есть различные существующие таблицы SQL, в которых есть float
столбцы с ценами, и мне нужно загрузить их в C # decimal
properties
После прочтения методов .HasConversion()
и .HasColumnType()
я подумал, что могу прочитать плавающий SQL (который EF Core должен знать как плавающий из-за .HasColumnType()
, и intern переводит его в double
) затем преобразуйте его в десятичный C #, используя метод .HasConversion()
; затем наоборот для обратной записи.
Я неправильно понял или неправильно использую методы?
Контекст 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));