3

既存の 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。同じ例外。
4

1 に答える 1

2

マッピングはモデルを定義します。各移行では、圧縮されたモデルの XML 表現 (およびおそらくハッシュも) が格納されます。デフォルトの規則を削除するなど、マッピング内の何かを変更すると、マッピングとそのハッシュの最終的な XML 表現も変更されます。EF はこれらのハッシュを使用して、モデルが変更されたかどうかを確認します。モデルを変更した場合は、それを機能させるために新しい移行も必要です。

于 2012-08-23T22:03:33.170 に答える