EF5代码首次迁移:小数精度和小数位数

时间:2012-08-23 21:14:53

标签: c# ef-migrations entity-framework-5

我正在尝试在现有的销售点信息亭应用程序中使用代码优先。这是一个加油站应用程序,所以我需要使用小数点后三位数的货币。

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

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十进制约定。与上述相同的例外
  • 从头开始构建最新的source code,并在DecimalPropertyConvention类中将默认比例更改为4。同样的例外。

1 个答案:

答案 0 :(得分:2)

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