C# EF5代码优先迁移:十进制精度和小数位数

C# EF5代码优先迁移:十进制精度和小数位数,c#,entity-framework-migrations,entity-framework-5,C#,Entity Framework Migrations,Entity Framework 5,我试图在现有的销售点信息亭应用程序上首先使用代码。这是一个加油站应用程序,所以我需要使用小数点后有三位数字的货币 我在迁移中使用以下代码来设置精度和比例: CustomSqlGenerator.DropDefaultConstraint("Config", "DefaultTaxPerDollar", q => Sql(q)); AlterColumn("Config", "DefaultTaxPerDollar", c => c.Decimal(nullable: false, pre

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

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

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,如图所示:

但这会产生
支持“SalesDataStore”上下文的模型自数据库创建以来发生了变化。考虑使用代码第一迁移来更新数据库()< /Code > < /P>
还尝试:

  • OnModelCreating
    方法中包括
    modelBuilder.Conventions.Remove()
    ,以完全删除18,2十进制约定。与上述相同的例外情况
  • 从头开始构建最新的,并将
    DecimalPropertyConvention
    类中的默认比例更改为4。同样的例外

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

如果您更改了模型映射中的任何内容或删除了默认约定,则还必须创建新的迁移。你试过了吗?嗯,我没想到。现在就试试看……这很管用。我想我没有意识到OnModelCreating是为了迁移而检查更改的。我以为这只是一个钩子,在创建模型之前调整一些东西。如果你发布一个答案,我会对此表示赞赏——我想其他人可能不清楚这种方法的本质。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .Property(c => c.DefaultTaxPerDollar)
        .HasPrecision(19, 4);

    base.OnModelCreating(modelBuilder);
}