以下針對如何使用 ADO.NET 實體資料模型連結SQL Server,以及如何在 ASP MVC 中的 Web API專案內使用實體資料模型取得資料庫資料。

實作流程:

1. 建立 MVC Web API 專案

2. 建立ADO.NET 實體資料模型

3. 根據資料庫的定義更新 實體資料模型


1. 關於 ASP MVC 專案建立這邊就不在贅述。

 

2. 建立ADO.NET 實體資料模型

2.1 專案建置好後對專案按 右鍵 > 新增(Add) > 新增項目(Item) > 資料(Data) > ADO.NET 實體資料模型(Entity Data Model) > 新增(Add)

image

2.2. 建立後選擇模型內容 > Generate from database

image

2.3. 選擇資料庫連線 > 建立連結字串( New Connection )

image

2.4. 產生連結字串( 請輸入相關資訊 )

image

以上建立完成後會產生一個 edmx 的資料模型檔,由於一些資料庫得設計比較嚴謹也比較完整因此以下情境假設為資料庫已經是先建置以及設計好而進行:

 

3. 右鍵 > Update Model from Database > 選擇要使用到的資源(表格、檢視表、預存程序) > 完成(Finsh)

image


以上設定完成後,會產生大量的設定檔,以下簡述一下相關設定:

資料庫連結的設定會存放在 {檔案名稱}.Context.cs 之中,而後續建立資料庫的物件就是該此物件。

image

而剛剛根據資料庫定義所產生的資料表則可以在 {檔案名稱}.tt 底下看到。

image

 


A . 以下是單一表查詢的程式範例 :

由於上述 實體資料模型設定完畢後,會將相關的資料格式定義完成,而一般資料表的查詢通常不會只有一筆資料,因此建立一個List來儲存(第 4 行)。

然後建立資料庫物件(第 6 行),執行LINQ 語法進行資料庫的查詢(第7行),查詢後利用ToList() 方法將資料轉成 List 的格式回傳即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// GET api/values
public IEnumerable<Models.Product> Get()
{
    List<Models.Product> result = new List<Models.Product>();

    Models.DB_testEntities db = new Models.DB_testEntities();
    result = (from s in db.Products select s).ToList();

    return result;
}

 

B . 以下是兩張表格(以上)查詢的程式範例 :

此處的關鍵在於為了能夠有效的將合併後的資料儲存起來,因此須建立一個新的物件來儲存資料,此案例為 ProductWithImage。

同時如果是作為Web API 的回傳值中的物件使用的話需要將此物件定義為 public class 。

public class ProductWithImage
{
    public string Name;
    public int Price;
    public string Path;
}

前置步驟完成後,一樣先建立一個List 來儲存資料 ( 第5行 ),再產生一個資料庫物件(第7行)。

然後下 LINQ 語法( 在此處的 join 預設是採用 inner join ),在join 完成後 最後在 select 的時候將每個資料與物件的欄位進行對應( 第 11 行),完成後一樣透過ToList()方法將資料轉成 List 的格式回傳即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// GET api/values
public IEnumerable<ProductWithImage> Get()
{

    List<ProductWithImage> result = new List<ProductWithImage>();

    Models.DB_testEntities db = new Models.DB_testEntities();

    result = (from p in db.Products
                join b in db.Images on p.DefaultImageId equals b.id
                select new ProductWithImage { Name = p.Name, Price = p.Price, Path = b.path }).ToList();

    return result;
}

※ 在這邊需要注意的是,LINQ 語法這邊的編譯器檢查,只會檢查 CS 檔中的格式,若定義的型別不同則無法編譯。

 

完整專案(連結)

arrow
arrow
    文章標籤
    mvc C#
    全站熱搜
    創作者介紹
    創作者 Lung-Yu,Tsai 的頭像
    Lung-Yu,Tsai

    Lung-Yu,Tsai 的部落格

    Lung-Yu,Tsai 發表在 痞客邦 留言(0) 人氣()