2012-08-23 33 views
3

我試圖在現有的銷售點應用中使用代碼優先。這是一款加油站應用程序,所以我需要使用小數點後三位數字的貨幣。EF5代碼第一次遷移:小數精度和刻度

我用我的遷移下面的代碼來設置精度及規模:

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方法的流利API如圖here的第一件事:在

  • 包括modelBuilder.Conventions.Remove<DecimalPropertyConvention>()

    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)

    也試過OnModelCreating方法,完全刪除18,2十進制常規。與上面相同

  • 從頭開始構建最新的source code,並在DecimalPropertyConvention課程中將默認比例更改爲4。同樣的例外。
+0

如果更改模型映射中的任何內容或刪除默認約定,則還必須創建新的遷移。你試過了嗎? –

+0

嗯,我沒有想到這一點。現在嘗試... – HiredMind

+0

這工作。我想我沒有意識到OnModelCreating是針對遷移目的的變化進行檢查的。我認爲這只是在模型創建之前調整某些東西的鉤子。如果你發表了一個答案,我會讚揚它 - 我認爲其他人可能不清楚這種方法的性質。 – HiredMind

回答

2

映射定義了您的模型。每個遷移存儲模型的壓縮XML表示(可能還包含散列)。當您更改映射中的任何內容(包括刪除任何默認約定)時,還會更改映射及其散列的最終XML表示形式。 EF使用這些哈希來檢查模型是否更改 - 如果您更改了模型,則還必須有新的遷移才能使其正常工作。