Code First 起手式
前言
從.NET 3.5開始,.NET提供了概念模型(conceptual model)的Entity Framework,概念模型可以根據資料庫(Database First)建立Model與資料庫的對應關係,並且存成XML檔案,副檔名為EDMX,讓你可以有GUI來管理Model,如下圖。
到了.NET4.0(EF4),推出了Model First,可以先不用先有資料庫,而從概念模型定義Model是什麼,進而產生實體資料庫。 EF4提供了Model First 跟Database First的方式來管理Model,而用Model First與Database First都是需要用到EDMX來產生對應的Model Class。
EF4同時也推出了新的管理Model的方式,稱為Code First。 使用Code First不需要有EDMX來做Model的管理。 沒有了EDMX,Code First使用POCO classes來定義 domain model。
Code First, Database First 和 Model First都是為了使用Entity Framework建立Entity Data Model的方式。 其實Entity Framework不管如何建立Model,因為在有Model後,Entity Framework 在runtime所做的行為都是是一樣的,
無論是選擇EDMX來管理Model或者是Code-based Modeling來管理Model其實都是可以達成目的的。根據下圖,可以讓讀者這些選擇之間的差別。
Code First
有些一些簡單的概念後,接下來就是進入本文章的主題,如何完成你的第一個Code First練習
NuGet安裝Entity Framework
安裝完後,會新增EntityFramework的相關參考以及config(App.config或者Web.config)幫你增加了一些設定。
新增兩個Model(稱為POCO class),Category及Product,而兩個Model就是對應到資料庫的兩個Table。
public class Category
{
public string CategoryId { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public string CategoryId { get; set; }
public virtual Category Category { get; set; }
}
我們對資料庫的操作都要使用DbContext,所以新增一個ProductContext並且繼承DbContext。
public class ProductContext : DbContext
{
public DbSet<Category> Category { get; set; }
public DbSet<Product> Product { get; set; }
}
Code First的起手式完成,接下來就是使用它
static void Main(string[] args)
{
using (var db = new ProductContext())
{
var toy = new Category { CategoryId = "1", Name = "Toy" };
db.Category.Add(toy);
db.SaveChanges();
Console.WriteLine("Finish");
}
}
執行完畢後,連資料庫都建好了!!
資料庫預設名稱為專案名稱+路徑+Context。 資料庫建立的位置,在安裝Entity Framework的時候就幫你自動在config設定好了。 這段是說明,資料庫類型是LocalDB,執行個體為mssqllocaldb。
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
使用內建的Code First模型(建議使用這種方式)
選擇空的Code First模型
使用預設空的Code First模型,最大的差別在於config會增加一個connectStrings的設定,產生的DBContext的連線設定會指定到connectionStrings。
<connectionStrings>
<add name="DefaultDBContext"
connectionString="data source=(LocalDb)\v11.0;
initial catalog=CodeFirstDemo2.DefaultDBContext;
integrated security=True;
MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
</connectionStrings>
public class DefaultDBContext : DbContext
{
// 您的內容已設定為使用應用程式組態檔 (App.config 或 Web.config)
// 中的 'DefaultDBContext' 連接字串。根據預設,這個連接字串的目標是
// 您的 LocalDb 執行個體上的 'CodeFirstDemo2.DefaultDBContext' 資料庫。
//
// 如果您的目標是其他資料庫和 (或) 提供者,請修改
// 應用程式組態檔中的 'DefaultDBContext' 連接字串。
public DefaultDBContext()
: base("name=DefaultDBContext")
{
}
// 針對您要包含在模型中的每種實體類型新增 DbSet。如需有關設定和使用
// Code First 模型的詳細資訊,請參閱 http://go.microsoft.com/fwlink/?LinkId=390109。
public virtual DbSet<MyEntity> MyEntities { get; set; }
}
透過connectStrings指定要建立的資料庫名稱,加入Database=HelloDB
<connectionStrings>
<add name="DefaultDBContext"
connectionString="data source=(LocalDb)\v11.0;
initial catalog=CodeFirstDemo2.DefaultDBContext;
Database=HelloDB;
integrated security=True;
MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
</connectionStrings>
起手式到這邊介紹完成啦,希望能透過這篇對Code First開發有一些概念。
參考:
http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-code-first-walkthrough.aspx
http://www.c-sharpcorner.com/UploadFile/5d065a/poco-classes-in-entity-framework/
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。