摘要:[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 建立資料庫,並寫入資料與讀取資料並顯示的練習,
下一段將做移轉的練習。