EF6 - Неверное приведение от десятичного до int32 - PullRequest
0 голосов
/ 31 мая 2018

У меня есть таблица с полем, определенным как ...

...
[oneField] NUMERIC(2) NULL,
...

И соответствующая модель сущности c # ...

...
public int? oneField { get; set; }
...

Свободная конфигурация ...

Property(r => r.oneField)
    .HasColumnName("oneField");

Ну, учитывая все вышесказанное, я получаю следующее исключение при извлечении данных из БД.

System.InvalidOperationException: The specified cast from a materialized
  'System.Decimal' type to a nullable 'System.Int32' type is not valid.

Есть идеи, как это исправить?Я мог бы понять, что если поле NUMERIC будет иметь десятичную часть, которая может вызвать проблему, но быть просто целочисленным значением из 2 цифр, почему не может быть преобразовано в INT32?

Примечание: я знаю, что если яизмените поле в таблице так, чтобы проблема INT была решена, но я бы хотел оставить NUMERIC (2), поскольку он лучше отображает значения, которые должны храниться там (числа с 2 цифрами).

Ответы [ 4 ]

0 голосов
/ 31 мая 2018

Предполагается, что вы используете sql server.Вот целочисленные типы .NET и числовые типы с максимальным соответствием:

  • SByte => -128 до 127, что подходит для NUMERIC(2)
  • Int16 => -От 32 768 до 32 767, что подходит до NUMERIC(4)
  • Int32 => -2 147 483 648 до 2 147 483 647, что подходит до NUMERIC(9)
  • Int64 => -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807, что соответствуетдо NUMERIC(18)
  • decimal может содержать до 7,9 * 10 ^ 28 до NUMERIC(28).

Проблема в том, что я сомневаюсь, что EF не понравится ваше преобразование, посколькуВы сначала кодируете БД и не хотите ничего менять, я думаю, единственное, что вы можете сделать, это принять его как десятичное и привести его на сторону клиента.

0 голосов
/ 31 мая 2018

Если вы хотите использовать NUMERIC(2), вам нужно свойство модели decimal, в противном случае вы увидите ошибки преобразования, о которых вы сообщаете.Таким образом, ваше решение состоит в том, чтобы изменить базу данных или изменить модель.

Однако, NUMERIC(2) является излишним для вашей цели и будет использовать 5 байтов, когда вы хотите, чтобы числа были только до 99. Вместо этого вам следует рассмотреть возможность использования TINYINT, что позволит вам хранить числа от 0 до 255. Это будет означать, что хранилище содержит только один байт, и ваша модель может иметь byte для соответствия.

0 голосов
/ 31 мая 2018

Хорошо, если вы хотите, вот ваша модель:

internal decimal? OneFieldIntenal { get; set; }
public int? OneField
{
    get => OneFieldIntenal.HasValue ? (int)OneFieldIntenal.Value : null;
    set => OneFieldIntenal = value;
}

Вот ваше отображение:

Property(r => r.OneFieldIntenal)
    .HasColumnName("oneField");

Но используйте это, только если вы АБСОЛЮТНО уверен, что вы делаете, и вы должны держать несоответствие типов.Это решение некрасиво.

0 голосов
/ 31 мая 2018

Насколько я понимаю, он говорит вам, что столбец материализован в объект System.Decimal, и вы пытаетесь привести его к объекту System.Int32, который не поддерживается.Попробуйте использовать INTEGER, чтобы определить столбец вашей базы данных

, или, альтернативно, используйте System.Decimal, чтобы определить ваш объект EF

...