EF5 代码优先迁移:小数精度和小数位数
Posted
技术标签:
【中文标题】EF5 代码优先迁移:小数精度和小数位数【英文标题】:EF5 code first migrations: decimal precision and scale 【发布时间】: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 已被检查以进行迁移更改。我认为这只是在创建模型之前调整某些东西的钩子。如果您发布答案,我会对此表示赞赏 - 我认为其他人可能不清楚这种方法的性质。 【参考方案1】:映射定义了您的模型。每个迁移都存储模型的压缩 XML 表示(可能还有哈希)。当您更改映射中的任何内容(包括删除任何默认约定)时,您也会更改映射的最终 XML 表示形式及其散列。 EF 使用这些哈希来检查模型是否更改 - 如果您更改模型,您还必须进行新的迁移才能使其正常工作。
【讨论】:
以上是关于EF5 代码优先迁移:小数精度和小数位数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 phpMyAdmin 在 MySQL 中指定小数精度和小数位数