目錄
1. Code First是什么?
2. Code First 簡單示例
3. 數據存儲
4. 遷移
Code First是什么
Code First 顧名思義就是先寫代碼,當然不是亂寫,而是按照一定的約定,先創建實體類,再通過編輯器自動生成數據模型。Code First是EF的三大模式之一,主要使用新的系統開發,對應數據庫已存在的情況下不適合。
Code First 簡單示例
下面通過一個簡單的示例,讓我們來熟悉一下Code First模式。
第一步:創建一個控制台程序,命名為“EF.CodeFirstSample”。

第二步:打開NuGet包管理界面,為上面新建的控制台程序安裝EF。
安裝成功之后,我們就可以在引用下面看到EF組件,如下圖:
第三步:創建模型
該示例中我們使用非常簡單的模型,直接Program.cs文件中進行定義。
在Program.cs中添加以下兩個類:
public class Blog { public int BlogId { get; set; } public string Name { get; set; } public virtual List<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public virtual Blog Blog { get; set; } }
第四步:創建上下文
創建一個上下文,用於和數據庫保持會話,以便我們查詢和保存數據。我們定義一個派生自System.Data.Entity.DbContext的上下文,並為模型中每個類公開一個類型化DbSet<TEntity>。
public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } }
第五步:讀寫數據
實現program.cs中的Main方法,如下所示,這些代碼為上下文創建一個新的實例,然后使用該實例為Blog表插入一條記錄,然后在從數據庫讀取所有的Blog,並且把名稱顯示出來,具體代碼如下:
static void Main(string[] args) { using (var db = new BloggingContext()) { Blog blog = new Blog() { Name = "this is a test Name!" }; db.Blogs.Add(blog); db.SaveChanges(); foreach (var item in db.Blogs) { Console.WriteLine("Name:"+item.Name); } } Console.Read(); }
運行結果

運行結果顯示,我們已經成功添加一條數據,並且成功讀取顯示出來,那我們的數據存儲在哪里呢?
數據在哪里
如果本地Sql EXPRESS實例可用(默認情況下隨vs2010安裝)的話, 則Code First默認對該實例創建數據庫;
如果Sql EXPRESS實例不可用,則Code First將嘗試使用LocalDb(默認情況下隨vs2012安裝);
如果Sql EXPRESS和LocalDb同時存在,則Code First會優先使用Sql EXPRESS;
如果兩個都不存在,則運行就報錯,所以需要自己在配置文件設置數據庫連接字符串。
由於我們只有LocalDb可用,所以運行之后在LocalDb中自定創建一個新的數據庫和物理表,如下:

數據遷移
在實際開發中經常會設計表之后再修改表結構,那么對於Code First中修改表又是如何實現的呢?例如,現在為Blog類增加一個Url屬性,如下:

再運行程序,會發現如下提示:

提示信息非常明確,這個時候通過遷移來更新數據庫。
第一步:打開NuGet控制台,輸入"Enable-Migrations"啟用Code First遷移。

第二步:在控制台中輸入“Add-Migration AddUrl”,其中AddUrl是遷移的名稱,方便以后根據這個名稱進行降級。

第三步:在控制台中輸入“Update-Database”,這個時候可能會因為當前項目不是啟動項而報錯,我們可以執行Update-Database的時候指定啟動,這么我只是簡單的將當前項目設置為啟動項。

至此,遷移工作完成,此時我們查看數據庫會發現,Blog表中已經增加了URL字段,見下圖:

