Сначала используйте тип денег в модели Entity Framework - PullRequest
7 голосов
/ 17 июня 2011

Я создал таблицу, в которой есть столбец с именем Amount, и я установил его как десятичное число. Я не могу найти, где установить его как деньги или мелкие деньги, и когда я пытаюсь установить значение, например, 0,2, оно округляется до 0 ....

Как я могу использовать деньги с каркасом сущностей?

спасибо!

Ответы [ 5 ]

3 голосов
/ 08 мая 2014

Одна из неприятных вещей в Entity Framework заключается в том, что он преобразует тип переменной Decimal в десятичный (18, 0) в SQL.

Число после запятой - это количество знаков после запятой, допустимое для этого числа. Таким образом, десятичное число (18,0) будет убирать числа после десятичной точки при сохранении.

Перейдите в раздел «Управление сервером SQL Server», найдите свою базу данных, щелкните правой кнопкой мыши таблицу и выберите «Дизайн». Затем выберите столбец из списка, и вы сможете изменить тип данных на Десятичный (18, 2), просто набрав в поле. Затем сохраните изменения в таблице. Затем он сохранит число в обычных двух десятичных разрядах, используемых в транзакциях в западной валюте. Если вам нужно больше десятичных знаков, просто увеличьте второе число в скобках соответственно.

Я никогда не находил настройки, которая изменяет это значение по умолчанию для EF, чтобы вместо этого генерировалось десятичное число (18, 2). Но тогда я никогда не смотрел: достаточно легко изменить в БД. Но если кто-то знает об этом, мне было бы интересно узнать, как это делается.

РЕДАКТИРОВАТЬ: дополнительная информация - в том числе исправление конфигурации - в этом ответе: Десятичная точность и масштаб в EF Code First

1 голос
/ 05 июня 2018

Мой ответ касается E.F 6.0 После решения аналогичной проблемы и проверки с помощью SQL Profiler: Платформа сущностей переводит тип переменной Decimal в десятичное значение (18, 2) в SQL.

Если вы хотите сохранить тип денег, я бы рекомендовал использовать аннотации данных и добавить

public class Account
{
    public int AccountId { get; set; }                

    [Column(TypeName="money")]
    public decimal Amount { get; set; }
}

Или, если вы используете Fluent API

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Account>()
                .Property(i => i.Amount)
                .HasColumnType("money");
}
  • Тип денег будет переведен в (19, 4)
0 голосов
/ 28 февраля 2015

Это похоже на Десятичная точность и масштаб в EF Code First , Сначала я использую EF 6.1 и код, который по какой-то причине определяет smallmoney как событие точности по умолчанию 2, хотя это / должно быть 4. Вам нужно добавить некоторый код Fluent, чтобы это исправить. Я использую что-то вроде:

public static void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<MYCLASSNAME>().Property(x => x.MYPROPNAME).HasPrecision(5+4, 4);
}
0 голосов
/ 08 мая 2014

Так что я думаю, что ваш вопрос, возможно, касался подхода Code first.Кроме того, я не уверен, какую версию SQL вы используете, мой ответ ниже только для SQL Server ... Но вы в основном будете делать то же самое для Oracle или MySQL.

Сначала модель:

Используя SQL Server, вы просто выбираете для поля значение «money» или «smallmoney», в зависимости от размера значения, которое вам нужно представить.

Сначала код:

Мне нужно было выразить денежный тип до 9999,99

В визуальном редакторе EDMX вы выберете скалярное свойство, перейдите в «Свойства», затем установите для него значение «Тип = десятичное число», а затем задайте гранями какТочность = 6 Масштаб = 2. Вы можете использовать аннотации данных, чтобы убедиться, что поле отображается и вводится как деньги.

0 голосов
/ 19 февраля 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...