实体框架存储过程-映射复杂属性
本文关键字:复杂 属性 映射 框架 存储过程 实体 | 更新日期: 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/jj691402Multiple 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