2

我有一个 edmx 数据存储,我正在尝试对其执行存储过程:

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

客户类具有以下结构

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属性始终为空。我试图以不同的格式返回结果集,但无论我做什么,它总是为空。

例如

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

但是这些列从未被拾起。

我究竟做错了什么?

谢谢。

4

2 回答 2

2

我不认为你可以那样做。根据MSDN

类型的每个属性:

• 必须有二传手。

• 必须对应于 CSDL 中的原始类型。

• 必须与生成的 DbDataReader 中的列名相对应(提供程序实现确定列是否与属性同名)。如果类型属性的名称与 Db​​DataReader 的字段不匹配,则实体框架会具体化该属性的默认值(如果它是在概念模型中定义的)。

您的地址是 CSDL 中的 ComplexType。我认为您必须使用可通过 ExecuteStoreQuery 实现的类型来构造对象。

于 2013-05-10T12:31:39.563 回答
0

对于未来的读者。

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

多个结果可以填充这种对象层次结构。

注意:EF 在使用 Translate 方法创建实体时不考虑任何映射。它只会将结果集中的列名与类上的属性名相匹配。

因此,对于 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 
于 2014-01-07T22:02:49.380 回答