EF Code First With Existing DataBase Modify Column
話說之前那一篇的 Entity Framework 觀念其實還是有很多地方是不大清楚的,像是使用 Code First with existing database 時什麼情況會異動到資料庫?什麼情況下需要做 Migrations?什麼情況下會直接吐個 Exception 給你而不是自動幫你多個 Table 或 Column?,所以今天就趁著一點時間來寫一下從接觸至今的處理經驗了…(說的好像經驗老到其實還是個新手) 前置工作 這次的範例中我們會需要一個無辜的資料庫讓我們(恣意蹂躪)測試。 就讓我們把這個偉大的資料庫命名為…Demo! 唔…其實 Products 先不用建起來,我們可以來做個實驗看看什麼時候會觸發 Migrations…好~建立起這個資料庫之後我們就可以馬上來寫 Code 玩玩看啦~! 這裡我們就使用 Console Application 就好。我們建立一個名為 EFMigrationDemo 的專案,並在根目錄處新增一個 Model 資料夾裡面放置我們最重要的類別。 在寫 Code 之前我們要先把 EntityFramework 裝起來~就直接打開 Package Manager Console 吧!請在 Console 中直接輸入: Install-Package EntityFramework 若不放心是否為最新就接著下: Update-Package EntityFramework 這樣就可以保證你所指定的套件是最新的! 前置工作這樣就算是告一段落了~ 寫 Code 囉 我們新增一個類別檔案於 Model 資料夾中 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 using System.Data.Entity; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EFMigrationDemo.Model { public class Customers // 類別名稱與資料庫中的表格名稱一樣 { // 標記該屬性(在資料庫中為欄位)為 Promary key //(若屬性結尾為 ID 依照 Conversion naming 規則 EF 會自己判斷出來) [Key] public int ID { get; set; } // 標記該欄位是不能為Null的 [Required] public string Name { get; set; } [Required] public string Address { get; set; } [Required] public string PhoneNumber { get; set; } [Required] public string Email { get; set; } // 標記這個屬性對應到資料庫中的欄位名稱為 NickName 而非 TheNickName // 而且該欄位的內容長度不超過50 [Column("NickName")] [MaxLength(50, ErrorMessage = "Your Nick Name too long")] public string TheNickName { get; set; } // 標記這個屬性並不會對應到資料庫中的任何欄位 [NotMapped] public string NameplusNickName { get { return Name + NickName; } } // 這是個類別所以還是可以有方法,而且不會被認為是欄位或是預儲程序 public void PrintName() { Console.WriteLine("My name is {0}", this.Name); } } // 繼承 DbContext 的類別可以當成是資料庫來進行操作,預設會去 Config 檔中抓取 connectionString 的 section 裡與類別名稱相同的項目,像是: // <add name="Demo" connectionString="" providerName=""> // 而類別名稱其實也可以不用跟資料庫名稱一樣 public class Demo : DbContext { // 被 DbSet 包起來的類別會被判定為是一個實體(也就是一個表格) // 所以屬性名稱並不會影響到表格名稱 public DbSet<Customers> Customer { get; set; } } } 這樣我們的 Model 類別就算準備好了,接下來就是準備呼叫端了~ ...