CodeFirst的意思是根據EF實體類創建對應的數據結構,創建過程由DotNet框架自己完成,程序員可以部分干涉。
1.CodeFirst數據庫策略
CreateDatabaseIfNotExists:默認的策略:如果數據庫不存在,那么就創建數據庫。但是如果數據庫存在了,而且實體發生了變化,就會出現異常。
DropCreateDatabaseIfModelChanges:此策略表明:如果模型變化了,數據庫就會被重新創建,原來的數據庫被刪除掉了。
DropCreateDatabaseAlways:此策略表示:每次運行程序都會重新創建數據庫,這在開發和調試的時候非常有用。
2.使用EF讀取數據時創建數據
步驟如下:
1)創建項目
2)添加EF實體類
3)添加DbContext派生類
首先要引入EntityFramework程序包,可以使用NuGet控制台命令:Install-Package EntityFramework -Version 5.0.0。
然后定義派生類,可以在構造函數或者app.config/web.config中定義數據庫策略。
構造函數定義:

1 public class BloggingContext : DbContext 2 { 3 public BloggingContext() 4 : base("TestEFConnection") 5 { 6 //代碼優先數據庫策略 7 //默認的策略:如果數據庫不存在,那么就創建數據庫。但是如果數據庫存在了,而且實體發生了變化,就會出現異常。 8 Database.SetInitializer(new CreateDatabaseIfNotExists<BloggingContext>()); 9 } 10 11 public DbSet<Blog> Blogs { get; set; } 12 public DbSet<Post> Posts { get; set; } 13 }
Web.config定義:
添加到appSettings節點
<add key="DatabaseInitializerForType Ebuy.Website.Models.EbuyDataContext,Ebuy.Website" value="System.Data.Entity.CreateDatabaseIfNotExists`1[[TestEF.TestCodeFirst.BloggingContext,TestEF.TestCodeFirst]],EntityFramework" />
TestEF.TestCodeFirst.BloggingContext:表示完整的類名稱,TestEF.TestCodeFirst:表示類所在程序集
注意:以上兩種選擇其一即可!
禁止數據庫策略:
<add key="DatabaseInitializerForType TestEF.TestCodeFirst.BloggingContext, TestEF.TestCodeFirst" value="Disabled" />
此配置將禁止應用CodeFirst創建數據庫!
4)讀取數據(創建數據庫)
運行程序使用EF上下文(DbContext派生類),讀取或者寫入數據到實體對象,提交數據后EF會根據數據庫策略刪除或創建數據庫。
注意:最好明確指定數據庫連接名稱(DbContext派生類構造函數中指定),否則因各自安裝數據庫組件的不同,可能得到的並不是預期效果。
官方說法是:
如果本地 SQL Express 實例可用(默認情況下隨 Visual Studio 2010 安裝),則 Code First 對該實例創建數據庫
如果 SQL Express 不可用,則 Code First 將嘗試使用LocalDb(默認情況下隨 Visual Studio 2012 安裝)創建數據庫
3.使用Migration相關命令主動遷移數據
CodeFirst模式默認使用CreateDatabaseIfNotExists策略,因此開發過程中常常遇到”數據結構已更改,需要更新數據”的錯誤提示,這時候就要使用Code First遷移。
遷移命令以下部分組成:
Enable-Migrations:啟動CodeFirst數據遷移,第一次遷移會創建Migrations文件夾,包括:Configuration.cs,<時間戳>_InitialCreate.cs(當前數據庫不存在時,不會創建此文件)。
Add-Migration:命令檢查自上次遷移后是否有更改,並使用所有更改搭建新遷移,可以為遷移指定名稱。
Update-Database:此命令將所有掛起的遷移應用於數據庫
1)已有當前數據庫
使用上面介紹的步驟創建數據庫后,CodeFirst會在當前數據庫__MigrationHistory表中添加遷移記錄,如:
使用Enable-Migrations命令初始化CodeFirst時,將在項目文件夾Migrations中創建MigrationId對應的文件。
如果實體模型改變了,那么使用Add-Migration [遷移文件名] 命令可以生成待遷移文件,最后使用Update-Database命令提交改變。
2)沒有當前數據庫
》執行Entity-Migrations,創建Migrations文件夾(只包括Configuration.cs)
》執行Add-Migration [遷移文件名]
》執行Update-Database創建數據庫
》查詢數據庫:select * from __MigrationHistory,會發現遷移記錄,MigrationId就是項目中對應的遷移文件名。