前言
Code First顧名思義,通告代碼創建實體與數據庫。示例中我們會創建表,分表是Studen,Teacher。
Code First實戰示例
打開VS2013,創建一個項目我這里是用的MVC框架來做的示例搞麻煩了,小伙伴們可用控制台一樣的。命名為EFCodeFirst,如下圖:
選中解決方案資源管理器中的項目,點擊右鍵,選擇”管理NuGet程序包” 添加EF
准備工作結束,接下來我們創建實體類,添加代碼如下:
Studen:
public class Studen { public Studen() { } [Key] public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public Studen(string name, int age) { this.Name = name; this.Age = age; } }
Teacher:
public class Teacher { public Teacher() { } [Key] public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public Teacher(string name, int age) { this.Name = name; this.Age = age; } }
接下來我們設置數據庫上下文Context,它繼承於DbContext類。構造一個函數base中是設置數據庫連接的驅動地址,要注意其中的對應關系Context代碼如下:
學習C#的同學應該都知道DbContext是EF關聯上下文所用的驅動,真對DbContext的解釋如下:
DbContext: DbContext 實例表示工作單元和存儲庫模式的組合,可用來查詢數據庫並將更改組合在一起,這些更改稍后將作為一個單元寫回存儲區中。
然后我們開始往下增加數據表的操作如下示例:
DbSet:表示上下文中給定類型的所有實體的集合或可從數據庫中查詢的給定類型的所有實體的集合。
public class Context : DbContext { //base與Config中數據庫連接字符串名稱一樣 public Context() : base("name=MyStrConn") { } public DbSet<Studen> studen { get; set; } public DbSet<Teacher> seacher { get; set; } }
到目前映射數據庫就添加完了(很簡單吧)接下來讓我們從程序處理,這大家應該都看得懂我是簡歷的MVC 所以方便省事直接仔仔action里面了 ,其中using里面就是EF對數據庫的操作,創建實體然后然后db添加到student里面,執行
SaveChanges()方法添加到數據庫
public ActionResult Index() { using (var db = new Context()) { Studen stu = new Studen("123", 11); db.studen.Add(stu); db.SaveChanges(); } return View(); }
接下來讓我們進行查詢,大家可以看到下面是讀取到了這樣我們添加表和數據就完成了。
EF添加新表-遷移苦
在上面我們添加了數據庫,但是在項目中兩個表肯定是不用夠用的。那我們在添加一個表。我們添加一個Car類,然后吧Car添加到Context上下文讀取中。
public class Car { public Car() { } [Key] public int Id { get; set; } public string Name { get; set; } public string Color { get; set; } public Car(string name, string color) { this.Name = name; this.Color = Color; } }
public class Context : DbContext { //base與Config中數據庫連接字符串名稱一樣 public Context() : base("name=MyStrConn") { } public DbSet<Studen> studen { get; set; } public DbSet<Teacher> seacher { get; set; } public DbSet<Car> car { get; set; } }
添加完之后,然后吧添加信息的字段改成Car類的字段
public ActionResult Index() { using (var db = new Context()) { Car car = new Car("123", "RED"); db.car.Add(car); db.SaveChanges(); } return View(); }
當我們再次執行啟動上下文執行文件,可以看到以下提示:
為毛?接下來看怎么解決
PM> Enable-Migrations -Force
在程序集“EFCodeFirst”中找到多個上下文類型。
要允許“EFCodeFirst.Models.Context”的遷移,請使用 Enable-Migrations -ContextTypeName EFCodeFirst.Models.Context。
要允許“EFCodeFirst.Models.ApplicationDbContext”的遷移,請使用 Enable-Migrations -ContextTypeName EFCodeFirst.Models.ApplicationDbContext。
PM> Enable-Migrations -ContextTypeName EFCodeFirst.Models.Context
正在檢查上下文的目標是否為現有數據庫...
檢測到使用數據庫初始值設定項創建的數據庫。已搭建與現有數據庫對應的遷移“201806050721085_InitialCreate”的基架。若要改用自動遷移,請刪除 Migrations 文件夾並重新運行指定了 -EnableAutomaticMigrations 參數的 Enable-Migrations。
已為項目 EFCodeFirst 啟用 Code First 遷移。
PM> Add-Migration AddSocialNameAndRefreshToken
正在為遷移“AddSocialNameAndRefreshToken”搭建基架。
此遷移文件的設計器代碼包含當前 Code First 模型的快照。在下一次搭建遷移基架時,將使用此快照計算對模型的更改。如果對要包含在此遷移中的模型進行其他更改,則您可通過再次運行“Add-Migration AddSocialNameAndRefreshToken”重新搭建基架。
PM> Update-Database
指定“-Verbose”標志以查看應用於目標數據庫的 SQL 語句。
正在應用顯式遷移: [201806050824112_AddSocialNameAndRefreshToken]。
正在應用顯式遷移: 201806050824112_AddSocialNameAndRefreshToken。
正在運行 Seed 方法。
問題解決刷新下數據庫看看我們的Car表存在否?
啟動程序然后進行添加看看是否可以添加上數據,到這步就可以看到數據添加完成了。
如果小伙伴在測試過程中遇到了下面這個問題重啟下SQL服務就好了。
寫了半天手累的狠,覺得覺得有用小伙伴們就點個贊吧。