2010年7月21日 星期三

使用Entity Framework設定Complex Types-以MVC中使用stored procedure為範例

在MVC使用Entity Framework來存取資料庫中的Stored Procedure應用中,若是遇到Stored Procedure回應出來的是一組複雜資料欄位,而這組資料欄位是目前專案中沒有一個類別與之相對應,此時,我們可以另外建立一個新的類別,也可以使用Entity Framework中的Model Browser視窗中的Complex Types來建立這個新的資料欄位組合,建立好後,就如同一個資料Model一樣,可以在專案中的Controller或是View,或是別的ViewModel中拿來使用,本文即說明如何利用Complex Types來建立這個新的資料欄位組合,Complex Types的點選位置如下圖示:


1.我們直接使用Northwind資料庫中的下面這個stored procedure來說明,假設我們透過這個stored procedure,我們需要產生這些欄位,而這些欄位並不是直接對應到某一個資料庫的Table或是專案程式內的類別,那我們可以透過這Complex Types來建立這些stored procedure所抓回來的程式欄位。

ALTER PROCEDURE [dbo].[CustOrdersDetail] @OrderID int
AS
SELECT ProductName,
        UnitPrice=ROUND(Od.UnitPrice, 2),
        Quantity,
        Discount=CONVERT(int, Discount * 100),
        ExtendedPrice=ROUND(CONVERT(money, Quantity *
                        (1 - Discount) * Od.UnitPrice), 2)
FROM Products P, [Order Details] Od
WHERE Od.ProductID = P.ProductID and Od.OrderID = @OrderID

2.我們利用Complex Types中的Add功能來產生一個新的Complex Types,並給予一個名稱「CustOrdersDetail」。



3.接著我們就建立「CustOrdersDetail」這個Complex Types下面所屬的每一個欄位,基本上我們對應到我們上面所提到那個stored procedure所查詢出來的每個欄位的資料型態,當然若是原來資料型態是decimal,我們這裡相對應的欄位就不可以為double.其他的例子也一樣,若是原來資料庫中欄位是smallint,則我們就不可設為int,最後程式在compile的時候,會顯示錯誤訊息。我們設定好後,也可點選每個欄位,然後選擇「屬性」去修改。



4.在Entity Framework應用中,我們還需為這個資料庫中的stored procedure建立一個Function Import(可查閱文章:EF與Stored procedure的Output),我們在這裡建立名稱為「FI_CustOrdersDetail」的Function Import,並且在Function Import設定視窗中,下拉並指定產生的資料型態為「CustOrdersDetail」這個Complex Types。建立好這個Function Import後,可供我們在MVC專案中去呼叫使用。


5.當我們建立好「CustOrdersDetail」這個Complex Types後,我們這裡示範在MVC專案中的Controller直接呼叫使用,將資料透過Function Import取回來,並放到List<CustOrdersDetail>這個List中,這裡我們在「Browse」這個Action中,先直接放入一個訂單編號10260當作是傳入stored procedure的參數,如下:

public ActionResult Browse()
{
    List<CustOrdersDetail> custOrderDetail = new List<CustOrdersDetail>();
    custOrderDetail = _contx.FI_CustOrdersDetail(10260).ToList();
    return View(custOrderDetail);
}

6.我們透過「Browse」這個Action,把資料庫中透過EF抓到的資料拋到相對應的View上顯示,在這裡我們可以看到,我們建立好「CustOrdersDetail」這個Complex Types後,它就像一個在Model中的類別,我們可以方便的在Controller或是View中使用,執行程式後,我們可看到下面由stored procedure抓來的訂單明細資料:


7.建立Complex Types最大的功用,應該是可讓我們快速的建立一個與「類別」(Class)相似的「型態」(Types),我們不用真的用程式去寫出一個類別,然就可以享受到類別的好處,並且用此Complex Types用來承接Entity Framework中自資料庫抓回來的資料,這個應該是使用Complex Types的一個優點。

沒有留言:

張貼留言