实体框架存储过程-映射复杂属性

本文关键字:复杂 属性 映射 框架 存储过程 实体 | 更新日期: 2023-09-27 18:13:05

我有一个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

但是这些列永远不会被拾取。

我做错了什么?

谢谢。

实体框架存储过程-映射复杂属性

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

类型为

的每个属性

•必须有setter

•必须对应于CSDL中的基本类型。

•必须与结果DbDataReader中的列名对应提供程序实现确定列是否具有相同的名称作为财产)。如果类型的属性名与字段,实体框架将属性的默认值(如果在概念模型。

你的地址是复杂类型在CSDL。我认为你必须用ExecuteStoreQuery具体化的类型来构造你的对象。

供将来读者参考。

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

Multiple Results可以填充这种对象层次结构。

注意: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