我正在尝试在现有的销售点信息亭应用程序中使用代码优先。这是一个加油站应用程序,所以我需要使用小数点后三位数的货币。
我在迁移中使用以下代码来设置精度和比例:
CustomSqlGenerator.DropDefaultConstraint("Config", "DefaultTaxPerDollar", q => Sql(q));
AlterColumn("Config", "DefaultTaxPerDollar", c => c.Decimal(nullable: false, precision: 19, scale: 4, defaultValue: 0.087m));
(DropDefaultConstraint
调用是this bug的解决方法。我尝试删除它 - 在初始迁移中创建列而不是稍后更改 - 无济于事。)
使用适当的精度和比例创建列。我可以使用SSMS正确输入值(即1.2345保存为1.2345)。但是当通过模型保存值时,所有值都会被截断 - 而不是舍入 - 到2位小数(例如0.5555变为0.55)。
我尝试的第一件事就是在OnModelCreating方法中使用Fluent API,如图所示here:
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。同样的例外。答案 0 :(得分:2)
映射定义您的模型。每次迁移都存储模型的压缩XML表示(也可能是哈希)。当您更改映射中的任何内容(包括删除任何默认约定)时,还会更改映射及其哈希的最终XML表示形式。 EF使用这些哈希来检查模型是否更改 - 如果更改模型,则还必须进行新的迁移才能使模型生效。