EF Core: Могу ли я использовать `.HasConversion ()` для преобразования числа с плавающей запятой в SQL на C #? - PullRequest
0 голосов
/ 04 июля 2019

У меня есть различные существующие таблицы 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));

1 Ответ

0 голосов
/ 04 июля 2019

Вам нужно будет создать собственный конвертер значений, например, так:

var converter = new ValueConverter<decimal, double>(
    v => (double)v,
    v => (decimal)v
);

, а затем использовать его в свободной конфигурации API:

modelBuilder
    .Entity<EntityType>()
    .Property(e => e.FeildName)
    .HasConversion(converter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...