[Entity Framework][Code First]Code First 起手式

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>

切換資料庫類型可參考:https://blogs.msdn.microsoft.com/davidobando/2012/08/14/changing-efs-default-connection-factory-from-localdb-to-sql-server/

 

使用內建的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

https://blogs.msdn.microsoft.com/davidobando/2012/08/14/changing-efs-default-connection-factory-from-localdb-to-sql-server/

http://www.c-sharpcorner.com/UploadFile/5d065a/poco-classes-in-entity-framework/

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。