【发布时间】:2012-08-19 11:11:49
【问题描述】:
我正在尝试在现有的销售点自助服务终端应用程序上使用代码优先。这是一个加油站应用,所以我需要使用小数点后三位的货币。
我在迁移中使用以下代码来设置精度和比例:
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 (@987654323@)
也试过了:
- 在
OnModelCreating方法中包含modelBuilder.Conventions.Remove<DecimalPropertyConvention>(),以完全删除18,2 十进制约定。与上述相同的例外 - 从头开始构建最新的source code,并将
DecimalPropertyConvention类中的默认比例更改为4。同样的例外。
【问题讨论】:
-
如果您更改模型映射中的任何内容或删除默认约定,您还必须创建新的迁移。你试过了吗?
-
嗯,我没想到。现在试试...
-
那行得通。我想我没有意识到 OnModelCreating 已被检查以进行迁移更改。我认为这只是在创建模型之前调整某些东西的钩子。如果您发布答案,我会对此表示赞赏 - 我认为其他人可能不清楚这种方法的性质。
标签: c# entity-framework-migrations entity-framework-5