Первые миграции кода EF5: десятичная точность и масштаб

Я пытаюсь использовать code-first в существующем киоске-приложении Point-Of-Sale. Это приложение для заправочных станций, поэтому мне нужно использовать валюты с тремя цифрами после запятой.

Я использую следующий код в своих миграциях, чтобы установить точность и масштаб:

CustomSqlGenerator.DropDefaultConstraint("Config", "DefaultTaxPerDollar", q => Sql(q));
    AlterColumn("Config", "DefaultTaxPerDollar", c => c.Decimal(nullable: false, precision: 19, scale: 4, defaultValue: 0.087m));

(Вызов DropDefaultConstraint является обходным путем для этой ошибки. Я пробовал удалить его - создавая столбец при первоначальной миграции, а не изменяя его позже - безрезультатно.)

И столбец создается с надлежащей точностью и масштабом. Я могу использовать SSMS для правильного ввода значений (например, 1,2345 сохраняется как 1,2345). Но когда значения сохраняются через модель, все значения усекаются, а не округляются, до 2 знаков после запятой (например, 0,5555 становится 0,55).

Первое, что я попробовал, это использовать Fluent API в методе OnModelCreating, как показано здесь:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .Property(c => c.DefaultTaxPerDollar)
        .HasPrecision(19, 4);

    base.OnModelCreating(modelBuilder);
}

Но это производит The model backing the 'SalesDataStore' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269)

Также пробовал:

  • Включение modelBuilder.Conventions.Remove<DecimalPropertyConvention>() в метод OnModelCreating, чтобы полностью удалить десятичное соглашение 18,2. То же исключение, что и выше
  • Создание последнего исходного кода с нуля и изменение масштаба по умолчанию на 4 в классе DecimalPropertyConvention. То же исключение.

person HiredMind    schedule 23.08.2012    source источник
comment
Если вы измените что-либо в отображении модели или удалите соглашение по умолчанию, вы также должны создать новую миграцию. Вы пробовали?   -  person Ladislav Mrnka    schedule 24.08.2012
comment
Хм, я не подумал об этом. Пробуем сейчас...   -  person HiredMind    schedule 24.08.2012
comment
Это сработало. Думаю, я не осознавал, что OnModelCreating был проверен на наличие изменений в целях миграции. Я думал, что это просто крючок, чтобы что-то подправить перед созданием модели. Если вы опубликуете ответ, я отмечу это - я думаю, что другим может быть неясна природа этого метода.   -  person HiredMind    schedule 24.08.2012


Ответы (1)


Отображение определяет вашу модель. Каждая миграция сохраняет сжатое XML-представление модели (и, возможно, также хэш). Когда вы меняете что-либо в сопоставлении, включая удаление любого соглашения по умолчанию, вы также изменяете окончательное XML-представление сопоставления и его хэш. EF использует эти хэши, чтобы проверить, изменилась ли модель или нет. Если вы измените модель, у вас также должна быть новая миграция, чтобы она работала.

person Ladislav Mrnka    schedule 23.08.2012