3

我正在尝试在现有的销售点自助服务终端应用程序上使用代码优先。这是一个加油站应用程序,所以我需要使用小数点后三位的货币。

我在迁移中使用以下代码来设置精度和比例:

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。同样的例外。
4

1 回答 1

2

映射定义您的模型。每个迁移都存储模型的压缩 XML 表示(可能还有哈希)。当您更改映射中的任何内容(包括删除任何默认约定)时,您也会更改映射的最终 XML 表示形式及其散列。EF 使用这些哈希来检查模型是否更改 - 如果您更改模型,您还必须进行新的迁移才能使其正常工作。

于 2012-08-23T22:03:33.170 回答