2014年3月19日 星期三

LINQ 與 Access - ASP.NET MVC 專案使用 LINQ to Access 的 LinqToDB.Templates

前面的文章介紹了 Linq To Access 這個套件,但並非使用它所提供的 T4 Templates 來建立 Data Context,而這一篇文章裡將會以 ASP.NET MVC 專案裡如何使用 LinqToDB.Templates 來做說明。

 


在開始進行操作之前要先說明,LINQ to Access 只能使用 Access 的 mdb 檔案,對於 accdb 檔案並不支援。

 

先建立一個 ASP.NET MVC 專案,然後將 Northwind.mdb 檔案加入到 App_Data 目錄下,

image

接著在「套件管理器主控台」裡輸入「Install-Package linq2db.Access」指令以安裝相關套件,

image

打開「LinqToDB.Templates」目錄,可以看到有很多的 T4 檔案,其中有關 Access 的有三個,但真正有需要手動修改的只有「CopyMe.Access.tt.txt」這個檔案,

image

開啟「CopyMe.Access.tt.txt」檔案就可以看到裡面有四個說明步驟,所以我們也就照著步驟做下去。

image

 

Step.1

先把 CopyMe.Access.tt.txt 複製到指定目錄中,這邊就照著上面的說明,在專案裡新增「DataModels」目錄然後將 CopyMe.Access.tt.txt 檔案複製到目錄下,然後改名為「Northwind.tt」,

image

幫我們把檔案複製到 DataModel 目錄下,修改檔案名稱並且存檔後,在錯誤清單裡會顯示錯誤,這個先暫時不要理會,因為這才是第一個步驟,還有幾個步驟還沒做,

image

 

Step.2

然後打開 Web.Config,並且加入 Connection String,如下:

<add name="MyDatabase"
     providerName="Access"
     connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|Northwind.mdb;Persist Security Info=False;" />

 

Step.3

回到 Northwind.tt 檔案,把第 6 行到第 34 行的註解說明文字給移除,剩下的就只會是幾行字,

image

接著是重點,因為複製過來的 T4 Template 檔案裡只是使用範例,所以要修改 NamespaceName 以及 Access mdb 檔案的路徑。

將 NamespaceName 修改為「WebApplication1.DataModel」。

在 T4 Templaate 裡無法使用 Server.MapPath,所以要使用「Host.TemplateFile」取得 T4 Template 檔案的所在位置後再取得 App_Data 目錄的路徑,因為要取得檔案路徑,所以需要加入 System.IO 的使用,

image

接著取得路徑,

image

最後是將 LoadAccessMetadata() 方法裡的路徑與 Access mdb 檔案名稱做修改,

image

當一切都修改完成後在儲存檔案後就會不會有錯誤訊息出現,然後展開 Northwind.tt 的箭頭,開啟 Northwind1.generated.cs,可以看到使用 T4 Template 所自動產生的 Data Context 內容,

image

這個自動產生的檔案沒有必要就不要做任何的變動。

 

Step.4

當建立好 DataModel 之後就來使用他來讀取 Access mdb 檔案的資料,開啟 HomeController.cs,建立 Action 方法,並且輸入讀取資料的程式碼,如下:

image

建立檢視頁面

SNAGHTML11d3bcd5

執行結果

image

 


其他的像 Create, Update, Delete 等操作,可以自行研究看看,甚至也可以試著使用 LINQ to DB 對不同的資料庫做存取操作。

我並沒有對他的效能、擴充性等做深入的研究,不過小型專案可以用 LINQ to DB 來試試看。

 

相關連結

IT's Blog: LINQ to DB. Introduction.

LINQ to DB
https://github.com/linq2db/linq2db

LINQ to DB  Code Examples
https://github.com/linq2db/examples

LINQ to DB Code Examples -  Access
https://github.com/linq2db/examples/tree/master/Access

NuGet Gallery | LINQ to Access 1.0.1
https://www.nuget.org/packages/linq2db.Access/

NuGet Gallery | Packages matching linq2db
http://www.nuget.org/packages?q=linq2db

LINQ to DB – Wiki
https://github.com/linq2db/linq2db/wiki

 

以上

14 則留言:

  1. 請教老師,若mdb路徑改成網路磁碟機可行嗎?
    謝謝

    回覆刪除
    回覆
    1. 這.... 我沒有做過這樣的例子與實例
      如果只是在 Server 主機的檔案總管裡在網站目錄中加入網路磁碟機
      我想這樣應該還不行
      應該還需要到 IIS 裡,在該網站去增加剛才所加的目錄
      畢竟網站並無法直接讀取主機裡的檔案系統,只會認得網站架構內的目錄
      你可以嘗試看看

      刪除
    2. 以前有做過網站要去讀取某網路磁碟機內的 Word 與 Excel 檔案
      做法就是除了要在主機裡增加網路磁碟機之外,網站也要去新增虛擬目錄

      刪除
    3. 會這樣問是因為有多人共同開發程式,access就不能夠各用一個~~所以!!!

      刪除
    4. 這是指在多人開發模式下才會這樣?還是未來上線也是這樣呢?
      如果開發與上線後都還是使用同一個 access 檔案,這本身就是個問題
      我不清楚為何要這樣設計,畢竟 Access 還是一個檔案
      比較適合的還是使用資料庫
      如果是開發階段要拿 Access 當作測試資料庫的話,其實還有很多其他做法可以取代
      畢竟使用 Access 做為網站的資料儲存媒體,這應該只有在小型系統才會有這樣的做法

      刪除
    5. 您好,上線後只會有一個access~
      會用access...純粹客戶需求!!

      刪除
    6. 既然多人共同開發同一個專案,如果可以的話,開發團隊熟悉 DI/IoC 的話,
      建立介面,然後分別建立使用 Access 的實作與使用 MS SQL Server 的實作,
      在開發的時候可以先採用 MS SQL 資料庫,
      而放到測試機與正式機的時候再抽換資料存取的實作程式,
      這是比較建議的做法。

      因為開發階段大家都共用一個 Access 檔案,裡面的結構與資料都會隨時改變,
      而且應該會遇到 I/O 存取與寫入的問題,
      所以開發期間可以改用另外一種方式來實作,
      因為資料存取的程式其變動程度會比其他的要來得少,其他的程式(例如商業邏輯的處理)變動就會比較多,
      商業邏輯的程式不因為資料存取的方是以及資料媒體的不同而受到影響,
      所以開發時可用 MS SQL Server,而測試階段或上線階段再切換為 Access。

      刪除
  2. 請教一下 linq to Access 有說明文件嗎?

    回覆刪除
    回覆
    1. 就直接看 Github 的 Wiki,那個就是文件(現在很多套件都是這麼做的)
      https://github.com/linq2db/linq2db/wiki

      刪除
    2. 其實 LINQ to DB 的 Github Readme.md 就已經相當清楚了
      https://github.com/linq2db/linq2db
      另外單元測試的程式碼就是使用說明
      https://github.com/linq2db/linq2db/tree/master/Tests

      刪除
  3. 我用了K大您的步驟,我的MVC專案整個掛了
    不曉得是不是因為VS2015的問題
    以下問題:
    無法載入型別 'WebApplication3.MvcApplication'。
    <%@ Application Codebehind="Global.asax.cs" Inherits="WebApplication3.MvcApplication" Language="C#" %>
    但我 Golobal.asax.cs在阿@@ 無解狀態Orz

    回覆刪除
    回覆
    1. 會掛掉,你應該直接問作者比較快吧
      我也只是介紹這個套件的使用,我自己本身除了當作寫這篇文章時所做的幾個專案有用,而且都正常,
      現在所做的專案也沒有需求會用到這個套件,
      所以我無法從你所提供的三言兩語去「通曉」你做了什麼呀

      P.S. 我不是靈媒

      刪除
  4. 我找了很多stackoverflow的解決方案,都無解了@@
    K大還是我把整個專案檔給你?

    回覆刪除
    回覆
    1. 寄專案給我,我是不會看的,請諒解
      還是請你將問題像原作者詢問

      刪除

提醒

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