Я пытаюсь использовать 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
. То же исключение.