星期五, 10月 04, 2013

Code First 紀錄

最近手頭有小案子,案子是一個人做,Database 部份可以完全自己控制,所以就把 Code First 的開發模式納入此專案,因為這種開發模式之前沒有經驗,所以在此記錄一下開發流程以及問題!

直接看圖說故事吧!

Nuget 下載 Entity Framework
 
clip_image001

設定 web.config

<connectionStrings>

    <add name="test" 
         connectionString="Data Source=(LocalDB)\v11.0;
AttachDbFilename=D:\Temp\CodeFirst\App\Database1.mdf;Integrated Security=True" 
         providerName="System.Data.SqlClient" />
 
    <!--<add name="test"
         connectionString="Data Source=server;Initial Catalog=xxxxx;
Persist Security Info=True;User ID=test;Password=test;MultipleActiveResultSets=True"
         providerName="System.Data.SqlClient"/>-->
</connectionStrings>

這兩個連線字串,看你的需求選一個來用,還有 providerName 很重要,Entity Framework 是靠著這 provider 來產生產生 Database 的 DDL(數據定義語言)、DML(數據操縱語言)和 DCL(數據控制語言)

class

public class User
{
    public User()
    {
        Roles = new List<Role>();
    }

    [Key]
    public Guid Id { get; set; }
    [Required]
    [StringLength(255)]
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime Birthday { get; set; }

    public IList<Role> Roles { get; set; }
}

public class Role
{
    public Role()
    {
        Users = new List<User>();
        Functions = new List<Function>();
    }

    [Key]
    public Guid Id { get; set; }
    [Required]
    [StringLength(255)]
    public string Name { get; set; }

    public IList<User> Users { get; set; }
    public IList<Function> Functions { get; set; }
}

public class Function
{
    public Function()
    {
        Roles = new List<Role>();
    }

    [Key]
    public Guid Id { get; set; }
    [Required]
    [StringLength(255)]
    public string Key { get; set; }
    public IList<Role> Roles { get; set; }
}


public class TestContext : DbContext
{
    public TestContext() : base("test") { }

    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<Function> Functions { get; set; }
}

這裡建立權限資料表,User、Role and Function 分別是多對多的關係

Command

這裡我是使用 command 來手動修改資料庫的方式

clip_image002

啟動 Migrations 機制,記得 Default porject 要選擇有裝 Entity framwork 5.0 的專案

clip_image003

> Enable-Migrations

接下來 visual studio 裡面模擬變更,「Init」可以自訂

clip_image004

> Add-Migration xxxxx

clip_image005

這檔案就是說明會對 Database 做哪些動作的檔案

最後更新 Database,後面參數是要把更新 database 的內容顯示出來

clip_image006

> update-database -Verbose

clip_image007

這樣就完成了,很簡單吧!如果我們之後要新增欄位,或是修改欄位名稱,只要修改完 Entity 後,執行「add-migration xxx」還有「update-database -Verbose」就可以更新完成了,還有這裡提醒一下,用 code first 開發方式,會在 database 裡面產生「__MigrationHistory」 這個 table, 沒事不要砍掉阿!因為所有更新的 schema 的更新紀錄都在裡面,砍掉後會有嚴重的後果(不要問,很恐怖) 一_一||

最後

這裡說一下我用這模式開發後的心得
  1. 用 linq to entity 去取得資料,條件變得簡單了,像是多對多的關係的 table,中間不用在卡一個關聯 table
  2. 開發起來真的像是在操作物件,不像之前 Database First 方式,感覺還是跟操作 table 一樣
  3. 方便直覺,幾乎都可以在 visual studio 裡面就把程式寫完了
所以這裡 Bibby 建議,如果有小案子,可以拿小案子來試試看,應該會有不錯的體驗喔 ^^

參考:
http://msdn.microsoft.com/zh-tw/data/ee712907