既存の POS キオスク アプリケーションでコード ファーストを使用しようとしています。これは給油所アプリなので、小数点以下 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 の 10 進法を完全に削除します。上記と同じ例外 - 最新のソース コードをゼロからビルドし、クラスでデフォルトのスケールを 4 に変更します
DecimalPropertyConvention
。同じ例外。