2013-05-10 46 views
1

我有一個EDMX數據存儲和我試圖針對它執行存儲過程:實體框架的存儲過程 - 繪製複雜性

. 
. 
. 
CustomerDb.ExecuteStoreQuery<Customer>("GetCustomers", parameters).ToList(); 

Customer類具有以下結構

class Customer { 
    public int Id { get; set; } 
    . 
    . 
    . 
    public Address Address { get; set; } 
} 

class Address { 
    public int Id { get; set; } 
    . 
    . 
    . 
    public string PostCode { get; set; } 
} 

現在不管我做什麼,Address屬性始終爲空。我試圖以不同的格式返回結果集,但不管我做什麼,它總是空的。

E.g.

SELECT c.Id, ..., a.PostCode 
FROM Customer AS c 
INNER JOIN Address AS a ON c.CustomerId = a.CustomerId 
WHERE c.CustomerId = @CustomerId 

SELECT c.Id, ..., a.PostCode AS 'Address.PostCode' 
FROM Customer AS c 
INNER JOIN Address AS a ON c.CustomerId = a.CustomerId 
WHERE c.CustomerId = @CustomerId 

SELECT c.Id, ..., a.PostCode AS 'Address_PostCode' 
FROM Customer AS c 
INNER JOIN Address AS a ON c.CustomerId = a.CustomerId 
WHERE c.CustomerId = @CustomerId 

但列永不回升。

我在做什麼錯?

謝謝。

回答

2

我不認爲你可以這樣做。據MSDN

類型的每個屬性:

•必須有一個setter。

•必須與CSDL中的基元類型相對應。

•必須與生成的DbDataReader中的列名相對應( 提供程序實現確定列是否具有與屬性相同的名稱 )。如果類型屬性的名稱與DbDataReader的 字段不匹配,則實體框架將在屬性 模型中定義的屬性的默認值實現 。

您的地址是CSDL中的ComplexType。我想你必須用可以用ExecuteStoreQuery實現的類型來構造你的對象。

+0

啊。感謝那! – Umair 2013-05-10 15:39:35

0

適合未來的讀者。

http://msdn.microsoft.com/en-US/data/jj691402

多個結果可以填充這種對象層次。

注:當使用Translate方法創建實體時,EF不考慮任何映射。它將簡單地將結果集中的列名與類中的屬性名匹配。

因此,對於Select查詢(查詢)中的屬性名稱和列非常「挑剔」。

這是一個古老的學校Northwind查詢,顯示如何使用單個輸入參數獲取多個對象。

Use Northwind 
GO 

/* 

Declare @OrderID int 
select @OrderID = (select top 1 OrderID from dbo.[Order Details]) 
EXEC dbo.uspOrderDetailsGetByKey @OrderID 

*/ 


IF EXISTS 
    (
    SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' and ROUTINE_NAME = N'uspOrderDetailsGetByKey' 
    ) 
BEGIN 
    DROP PROCEDURE [dbo].[uspOrderDetailsGetByKey] 
END 


GO 

CREATE Procedure dbo.uspOrderDetailsGetByKey (
@OrderID int 
) 
AS 

BEGIN 

    SET NOCOUNT ON 

    /* Result #1 */ 
    SELECT 
     c.CustomerID, c.CompanyName,c.ContactName,c.ContactTitle,c.[Address],c.City,c.Region,c.PostalCode,c.Country ,c.Phone,c.Fax 
    FROM 
     dbo.Customers c 
     JOIN Orders o ON c.CustomerID = o.CustomerID 
    WHERE 
     o.OrderID = @OrderID 

    /* Result #2 */ 
    SELECT o.OrderID,o.CustomerID,o.EmployeeID,o.OrderDate,o.RequiredDate,o.ShippedDate,o.ShipVia ,o.Freight,o.ShipName,o.ShipAddress,o.OrderID,o.CustomerID,o.EmployeeID,o.OrderDate 
    FROM 
     dbo.Orders o 
    WHERE 
     o.OrderID = @OrderID 

    /* Result #3 */ 
    SELECT od.OrderID,od.ProductID,od.UnitPrice,od.Quantity,od.Discount 
    FROM 
     dbo.[Order Details] od 
    WHERE 
     exists (select null from dbo.Orders innerTable where innerTable.OrderID = od.OrderID and innerTable.OrderID = @OrderID) 

    SET NOCOUNT OFF 

END 

GO