[Entity Framework] Code First (1)

  • 885
  • 0

摘要:[Entity Framework] Code First (1)

當 EF 安裝好後,接著可以開始新增來建立資料模型,

這邊採用的是 Code First ,就是透過撰寫程式碼,就能依照組態所設定的連線與存取DB方式,

建立出與程式瑪對應的資料庫結構與資料,先用預設的 Code First 範本來新增 .cs 檔案:

新增後,會看到 Model1.cs的預設內容為


namespace ConsoleApplication2
{
    using System;
    using System.Data.Entity;
    using System.Linq;

    public class Model1 : DbContext
    {
        // Your context has been configured to use a 'Model1' connection string from your application's 
        // configuration file (App.config or Web.config). By default, this connection string targets the 
        // 'ConsoleApplication2.Model1' database on your LocalDb instance. 
        // 
        // If you wish to target a different database and/or database provider, modify the 'Model1' 
        // connection string in the application configuration file.
        public Model1()
            : base("name=Model1")
        {
        }

        // Add a DbSet for each entity type that you want to include in your model. For more information 
        // on configuring and using a Code First model, see http://go.microsoft.com/fwlink/?LinkId=390109.

        //public virtual DbSet MyEntities { get; set; }
    }

    //public class MyEntity
    //{
    //    public int Id { get; set; }
    //    public string Name { get; set; }
    //}
}

這是因為剛用範本新增,或者自己新增一個類別檔案從頭自己寫起也是沒問題,

另外預設還幫忙在 App.config 裡面加入 connectionStrings


  <connectionStrings>
    <add name="Model1" connectionString="data source=(LocalDb)\MSSQLLocalDB;initial catalog=ConsoleApplication2.Model1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>

name="Model1" 就是Model1.cs 繼承 DbContext 類別檔中


public Model1()
            : base("name=Model1")
        {
        }

所對應的連線字串名稱,所以 DbContext 若需要連接資料庫時,

就會從這個連線名稱,找到連線字串,再經由連線字串所設定的方式,連接到資料庫操作,

接著將 Model1.cs 裡面的這兩段註解拿掉,


 public virtual DbSet MyEntities { get; set; }

    public class MyEntity
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

讓 Model1 class 擁有 MyEntities 屬性,該屬性名稱預設就是 DB 的 Table Name,

現在來執行一下程式,


        static void Main(string[] args)
        {
            using (var entities = new Model1())
            {
                entities.MyEntities.ToList();
            }
        }

這麼寫沒有什麼意義,不過因為尚未建立資料庫,DbContext當被使用時,

預設會去判斷資料庫是否存在,若不存在則會建立資料庫,

執行完後,就會看到資料庫被建立起來,

打開 VIEW→SQL Server Object Explorer→SQL Server→(localdb)\MSSQLLocalDB (SQL Server 12.0.4100 - xxx\ooo) 

 

建立後,看到 Table 會有兩個欄位,就如同你程式寫的類別一樣,

分別為整數型別的 Id 與字串 Name,依照預設,若無特別指定,

以Id為字尾的屬性名稱,會當被作 PK(唯一值),

string 若無指定長度,預設會是 nvarchar(max) 且可以為 null,

不過不可能建立資料庫是像上面 .ToList() 那樣做,正常會這樣:


            using (var entities = new Model1())
            {
                entities.Database.CreateIfNotExists();    
            }

 既然資料庫中已經出現我們寫的 MyEntities 資料表,

為何還有一個叫做 __MigrationHistory 的資料表?

從字面上看來,是移轉的歷史紀錄,原來是使用 Code First 建立資料庫結構的話,

預設就會建立 __MigrationHistory 資料表,負責紀錄之後若需要修改資料庫結構,

例如新增資料表、修改欄位、刪除索引等操作,皆會由移轉這個動作來完成,

具體是建立好一段資料庫結構修改的程式碼,

然後透過 Package Manager Console 下 Update-Database 指令來更新或復原資料庫結構,

移轉的方式之後再說,先來建立一下資料試試看吧,


        static void Main(string[] args)
        {
            using (var entities = new Model1())
            {
                entities.MyEntities.Add(new MyEntity { Name = "jGame" });
                entities.SaveChanges();


                foreach (var item in entities.MyEntities)
                {
                    Console.WriteLine("Id:{0} Name:{1}", item.Id, item.Name);
                }
            }

            Console.Read();
        }

看到的結果應是如此

這章節透過預設的範本,幫我們設定好連線字串與基本的類別,

並且透過 CreateIfNotExists 建立資料庫,並寫入資料與讀取資料並顯示的練習,

下一段將做移轉的練習。

 

參考: 使用 Fluent 應用程式開發介面設定/對應屬性與型別