我正在尝试在现有的销售点自助服务终端应用程序上使用代码优先。这是一个加油站应用程序,所以我需要使用小数点后三位的货币。
我在迁移中使用以下代码来设置精度和比例:
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)。
我尝试的第一件事是在 OnModelCreating 方法中使用 Fluent API,如下所示:
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 十进制约定。与上述相同的异常 - 从头开始构建最新的源代码
DecimalPropertyConvention
,并将类中的默认比例更改为 4。同样的例外。