2014年7月18日 星期五

Console Application 使用 Entity Framework Code-First

我一般在練習 Entity Framework 操作時不管是 Database-First 或 Code-First 都是直接建立一個新的 ASP.NET MVC 專案來使用,而如果要換成 Console Application(主控台應用程式)時,在 Database-First 使用情境下與一般使用 ASP.NET MVC 專案並沒有什麼太大的差異,不過要是換成使用 Code-First 的時候就會有很大的差異。

這篇就簡單紀錄在 Console Application 專案裡使用 Entity Framework Code-First 的操作。

 


以下文章裡所建立的類別與操作指令會沿用「ASP.NET MVC 使用 Entity Framework Code First - 基礎入門」這一篇文章裡的內容。

先建立一個 Console Application 專案,然後我將專案使用 Nuget 加入 EntityFramework 6.1.1,

image

接著新增一個 Models 目錄,並且建立 SystemUser.cs, SystemRole.cs, SampleContext.cs 等類別,

image

接著依據在 ASP.NET MVC 專案的開發經驗,我們可能會想要在 Console Application 裡新增一個「App_Data」的目錄,但是 Console Application 專案並沒有建立「App_Data」的項目,所以有人就會手去動建立目錄,其實這邊可以將資料庫檔案給放到根目錄裡,於是這邊我們在根目錄下新增「服務架構資料庫」,

image

服務架構資料庫也是 LocalDB,建立好資料庫然後啟用資料連接之後,開啟 SSMS 然後連接到 LocalDB 就可以看到剛才所建立的資料庫,

image

建立好資料庫之後,要在 App.Config 裡加入 Connection String,

<connectionStrings>
    <add name="DefaultConnection"
        connectionString="data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\Database1.mdf;integrated security=True;"
        providerName="System.Data.SqlClient" />
</connectionStrings>

image

再來就是開始執行 Code-First 的第一次指令操作,分別執行以下的內容:

enable-migrations

add-migration Init

update-database –Verbose

分別執行完以上的三個操作指令之後,開啟根目錄下的 Sample.mdf,然後在伺服器總管裡所開啟的資料庫卻沒有看到應該要建立的資料表格,

image

每執行一次 migration 指令之後就會重新建置專案,而 Console Application 與 ASP.NET MVC 專案不同,主控台應用程式並不是去更新專案根目錄下的資料庫檔案,而是去更新 bin/Debug 目錄下的資料庫檔案,

image

image

而且當我們清除方案或是重新建置專案之後,原本已經有執行過 migration 並且有建立 table 的資料庫又重回預設狀態,

image

這是因為 Console Application 專案與一般網站專案不同,所以 Console Application 不適合使用在專案根目錄裡建立資料庫檔案的方式來執行 EntityFramework 的 Code-First 操作。

 

難道 Console Application 專案就不能使用 EF Code-First 操作嗎?其實並不是這樣的,我們可以看到 MSDN 裡有關介紹 EntityFramework Code-First 的教學文件裡,也是一樣使用 Console Application 專案來做示範,

MSDN - Data Access and Storage > 學習園地 > Entity Framework > 開始使用 > Code First 移轉

我們上面的操作與 MSDN 教學文件的差別在於教學文件並沒有直接在專案裡建立資料庫檔案,而是讓 EF 去建立資料庫,文件裡已經有做說明:

如果已安裝 SQL Express (包含在 Visual Studio 2010 中),則會在您的本機 SQL Express 執行個體 (.\SQLEXPRESS) 上建立資料庫。如果未安裝 SQL Express,則 Code First 會嘗試並使用 LocalDb ((localdb)\v11.0),LocalDb 隨附於 Visual Studio 2012。

所以我們將 App.Config 的 ConnectionString 先註解掉,然後把 SampleContext.cs 有指定 ConnectionString 的地方也拿掉,

image

image

把 Migrations 目錄移除,然後再重新執行 migrations 指令,就可以看到 EF 會自動到開發環境裡的 SQLExpress 去建立資料庫與表格,

image

預設所建立的資料庫名稱將會使用資料內容類別的完整名稱,例如「BlogSample.Models.SampleContext」

image

如果不想建立在 SQL Server Express 裡的話,而是想建立為 LocalDB,那麼可以在 App.Config 裡的 Connection String 做指定。

原本使用資料庫檔案,是在 ConnectionString 裡使用「attachdbfilename=|DataDirectory|\Database1.mdf」,但是這樣會在每次重建專案時會讓一切又再重來,所現在就改用以下的內容,讓 LocalDB 幫我們建立資料庫,

<connectionStrings>
    <add name="DefaultConnection"
        connectionString="data source=(LocalDB)\v11.0;Initial Catalog=ConsoleBlogSample;integrated security=True;"
        providerName="System.Data.SqlClient" />
</connectionStrings>

記得資料內容類別要使用指定的 ConnectionString,

image

完成修改之後,一樣是先移除 Migrations 目錄,然後再重新執行 migrations 指令,

image

在上面圖片裡的執行訊息內容,可以看到在 LocalDB 裡建立了指定名稱的資料庫,

image

而這個 LocalDB 的資料庫檔案位置會預設放在登入使用者的目錄中,

image

 


這篇文的內容就是這樣,沒有在 Console Application 專案裡使用過 EntityFramework 的 Code-First,在昨晚的 twMVC 週四聚會裡就有參加的朋友提出這個問題,我一時間不曉得如何因應,所以今天就對 Console Application 專案使用 EF Code-First 做個瞭解,並且將過程與結果記錄下來,也讓對於這個部分有疑問的朋友可以藉此文章來瞭解原因。

 

延伸閱讀

MSDN - Data Access and Storage > 學習園地 > Entity Framework > 開始使用 > Code First 移轉

MSDN - Data Access and Storage > 學習園地 > Entity Framework > 開始使用 > Code First 至新的資料庫

 

以上

沒有留言:

張貼留言

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。