Entity Framework - 使用Code First模式

29 March 2012 — Written by Sky Chang
#Entity Framework

2013/05/30 更新,目前最新的文章在這邊。此版本為4.1版本。

印象沒記錯的話,其實在EntityFramework 4.1的時候,Code First模式就已經出來了,但是使用後,覺得卡卡的,再加上一些問題( 下一篇會提到 ),所以也沒有真正的好好研究使用,而最近,因為ASP.NET MVC 4的關係,也改良了一些東西,所以就邊看原文,邊翻譯,邊把它紀錄下來吧,此內容和原文有一點點的差異,有興趣的也可以直接看原文

小弟在開ASP.NET MVC 4專案的時候,發現預設還是4.1,如果發現還是4.1,可以使用NuGet取得最新版本。

image

What’s Code First

不知道大家是怎樣開始專案的呢?我相信,最常聽到的應該是,看使用者的需求,然後來規劃資料庫,畫出ER圖,然後就開始努力地下去Coding了( 這裡就不討論怎樣軟體開發流程是好是壞了。 )。

接下來呢!?早期小弟在寫ASP的時候,會在裡面加上一堆SQL、邏輯、畫面,組合成義大利麵式的程式碼!( 可惜實際上不夠美味 ),後來使用ASP.NET的時候,也差不了多少,一樣在.cs的檔案裏面放上一堆SQL,只是那時候用Dataset,感覺上比較高級了,後來懂得把Table變成一個又一個的物件,至少有拆開了=w=,到現在,會使用Repository Patten來拆開資料存取層,也會利用EntityFramework來進行ORM,至少有進步了XDD。

但是無論怎樣的設計上,還是會先考慮資料庫模型,想好Table的關聯,畫好ER圖,建好DB後,在開始寫程式。

而這樣的作法,也不是說好或不好,畢竟,沒有不好的方法,只有用錯的地方=w=,但今天,EntityFramework帶來另外一種作法,也就是Code First。( 如果先建立DB,就稱為DB First,如果利用EF工具,先建立好模型,就稱為Model First。)

廢話了一堆,Code First,簡單的說,就是不先建立db,也不用EF的工具建立模型,而是直接利用建立好的類別產生DB!

有沒有很酷!,老實說我覺得酷斃了,因為這樣,我就可以專心思考OO的架構,而不會分心於DB的設計上,但實際上總是現實的,因為在公司上,還有公司的DB之神,DBA在管理資料庫…

但不管怎樣,這個還是個好物,所以歷經許久後,小弟就在這邊稍微Demo一下吧!

建立Code First Demo

首先,我們就不大材小用了,這麼小小的範例,當然使用主控台應用程式就可以了!

image

接下來,我們要在專案上,按下滑鼠右鍵,選擇NuGet,來取得最新版本的EntityFramework。

image

然後,假設我們要寫一個客戶的管理程式,那自然,就要先建立一個客戶的Class,我們新增一個Class,取名為ClientBasic。

image

接下來呢!?當然就是開始打ClientBasic的程式碼啦!,那db呢!?,別忘了我們現在是Code First,顧名思義,就是先打Code!!

我們建立一個ClientBasicId,代表唯一的編號,和一個Name,就這麼簡單。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MigrationsCodeDemo
{
    public class ClientBasic
    {
        public int ClientBasicId { get; set; }
        public string Name { get; set; }
    }
}

然後,我們要建立另外一個程式碼,這個程式碼主要繼承於DbContext,簡單的說,就像是個資料庫一般,裡面會有一個屬性ClientBasics,就像是Table。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;

namespace MigrationsCodeDemo
{
    public class ClientBasicContext : DbContext
    {
        public DbSet<clientbasic> ClientBasics { get; set; }
    }
}

接下來,我們只要修改Program.cs,程式開始運作時,我們會先建立一個ClientBasicContext物件( 稱為db ),裡面會有許多方法,用來處理所有和資料庫有關的行為,然後我們在db.ClientBasics這個屬性( 可以想成ClientBasics Table ),加上一個物件( 可以想像成,加上一筆資料),而裡面有屬性Name( 可以想像成欄位Name ),值為Sky,最後利用SaveChanges方法,就會將資料寫回到資料庫。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MigrationsCodeDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            using(var db = new ClientBasicContext())
            {
                db.ClientBasics.Add(new ClientBasic { Name = "Sky" });
                db.SaveChanges();
            }
        }
    }
}

然後,就開始跑程式,沒錯!!黑黑一片!!因為我們本來就沒有輸出甚麼,當然黑黑一片。

image

但我們去看資料庫,就會發現,他自動地幫我們建立了資料庫和Table!!,神奇吧!!就如前面所說的,我們可以完全不用考慮db該如何建,而會專心思考物件要怎麼寫,但實際上,小弟還沒有案子真正的這樣試過就是了= =..

image

如果去查資料,可以查到一筆

image

後記

就如前面流程,小弟我完全沒添加任何設定,甚至連App.Config都沒有改,預設似乎會自動去抓本機的資料庫,有需要改資料庫的人,還是可以去調整一下App.Config。

小弟這個範例,就是很簡單的先去建立類別,然後資料庫就自動幫忙建立起來了,但是聰明的你應該已經注意到了,那如果Class的屬性增加後,資料庫會不會自動變更!?答案已經很清楚了,在4.1他會丟出例外給你看XDD,所以必須先刪除掉資料庫,才能重新Run一次,也因此,下篇就會解紹真正的重點,如何處理這種問題!

參考資料

Sky & Study4.TW