前面咱們追加數據的時候遺留下來一個問題,就是在追加數據的時候,票價(Price)字段中輸入的是9.99元,可是電影清單顯示畫面中該數據的票價字段顯示爲10元,這是爲何?這個問題發生的緣由是由於,當EF code-first在建立數據表的時候,若是字段爲Decimal類型,則使用默認的精度(18:0),從而使得9.99元被四捨五入成爲10元。如今咱們想要將這個默認的精度修改成(18:2),從而使得數據表中的票價字段可以存儲小數點後的兩位數字。可喜的是EF code-first容許你很容易地重載這個定義模型如何向數據庫中存取數據的映射規則。你能夠利用這個重載機制來重載EF code-first中默認的類型定義以及數據表的繼承規則,而後在這個基礎上進行數據的存取。爲了改變咱們的票價(Price)字段在數據表中的精度,打開Models文件夾下的Movie.cs文件。追加一句引用System.Data.Entity.ModelConfiguration的語句,代碼以下:數據庫
using System.Data.Entity.ModelConfiguration;瀏覽器
並在MovieDBContext類中重載OnModelCreating方法,代碼以下所示:ide
public class MovieDBContext : DbContext { public DbSet<Movie> Movies { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Movie>().Property(p => p.Price).HasPrecision(18, 2); } }
OnModelCreating方法能夠被用來重載與定製規定咱們的模型類如何與咱們的數據表,進行映射的映射規則。代碼中使用了EF的ModelBuilder API來定義咱們的Movie對象的票價(Price)字段的精度爲準確到小數點後兩位。測試
如今完整的Movie.cs中的代碼以下所示:ui
using System; using System.Data.Entity; using System.Data.Entity.ModelConfiguration; namespace MvcMovie.Models { public class Movie { public int ID { get; set; } public string Title { get; set; } public DateTime ReleaseDate { get; set; } public string Genre { get; set; } public decimal Price { get; set; } public string Rating { get; set; } } public class MovieDBContext : DbContext { public DbSet<Movie> Movies { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Movie>().Property(p =>p.Price).HasPrecision(18, 2); } } }
如今讓咱們從新運行應用程序,在瀏覽器中輸入「http://localhost:xx/Movies」。當應用程序啓動的時候,EF code-first將會再次察覺咱們的模型類中的結構與數據表的結構再也不匹配,而後自動重建數據表與新的模型類的結構進行匹配(具備新的票價(Price)字段的精度)。從新建立一個新的電影(Movie)數據,在票價(Price)字段中輸入9.99。請注意數據表中保存後顯示在電影清單畫面中的該條數據的票價(Price)字段中如今也顯示爲9.99了,如圖所示:spa
本節介紹瞭如何快速調整你的模型對象,同時在改變模型類的結構時自動將數據表中的結構保持同步。咱們也介紹瞭如何預先在自動重建的數據表中追加默認數據,它使得你能夠快速在數據表中追加一些測試數據。在下一節中,咱們將介紹如何在咱們的模型類中加入咱們自定義的數據有效性校驗規則,從而強制實現一些業務規則。code
另注:4.0之後的EFramework已經不存在該精度錯誤。因此愈來愈好了,嘻嘻。對象