【问题标题】:No Complex Type created from new stored procedure, EF database first没有从新存储过程创建的复杂类型,EF 数据库优先
【发布时间】:2019-03-21 19:18:16
【问题描述】:

我不明白为什么 EF6 不会为我的存储过程创建复杂类型。我正在使用数据库优先的方法。

我在 SSMS 2017 中创建了一个新的存储过程。打开我的 EDMX,右键单击“从数据库更新模型”,检查我的存储过程并完成。

在我的模型浏览器中,我看到了我的存储过程,但没有创建复杂类型。然后我找到this post 并尝试从“编辑函数导入”创建一个复杂类型,但是当我单击“获取列信息”时它告诉我 “选定的存储过程或函数不返回任何列。”

当我在 SSMS 中运行我的存储过程时,它会返回我想要的数据。

这是我的存储过程

SELECT DISTINCT
    r.ROId, ru.VIN, ru.Year, ru.Make, ru.Model, ru.ModelNo, ru.PlateNo, ru.Note 
INTO
    #ROUnits
FROM  
    tbl_ROUnits ru
INNER JOIN 
    tbl_RepairOrder r ON ru.ROUnitId = r.UnitId
INNER JOIN 
    tbl_ServiceItems s ON r.roid = s.roId
INNER JOIN 
    tbl_TechServiceItems tsi ON tsi.ServiceItemId = s.ItemId
WHERE 
    tsi.EmployeeId = @EmployeeID 
    AND s.IsActive = 1 
    AND tsi.IsCompleted = 0

SELECT DISTINCT
    r.ROId, c.CustomerId, c.CompanyId, c.CompanyName, 
    c.FirstName, c.MiddleName, c.LastName, c.Suffix, 
    c.Phone1, c.Phone2, c.Email
INTO 
    #Customer
FROM
    tbl_Customer c
JOIN
    tbl_RepairOrder r ON r.CustomerId = c.CustomerId
JOIN
    tbl_ServiceItems si ON si.ROId = r.roid
JOIN
    tbl_TechServiceItems tsi ON tsi.ServiceItemId = si.ItemId
WHERE 
    tsi.EmployeeId = @EmployeeID 
    AND r.IsActive = 1 
    AND c.IsActive = 1 
    AND tsi.IsCompleted = 0

SELECT DISTINCT
    r.ROId, r.RONo,
    s.ItemId, s.Repair, s.Problem, s.Solution, 
    s.CalculatedHrs, s.ActualStartDateTime, s.IsCompleted, s.CompletedDate,
    s.ActualEndDateTime, s.StatusId, s.RepairNo,
    rs.ROStatusId, rs.Name, rs.IsActive, rs.Description
INTO
    #ServiceItem
FROM
    tbl_ServiceItems s
INNER JOIN 
    tbl_RepairOrder r ON s.ROId = r.ROId
INNER JOIN 
    tbl_TechServiceItems tsi ON tsi.ServiceItemId = s.ItemId
LEFT JOIN 
    tbl_ROStatus rs ON rs.ROStatusId = s.StatusId
WHERE 
    tsi.EmployeeId = @EmployeeID
    AND s.IsActive = 1  
    AND tsi.IsActive = 1 
    AND tsi.IsCompleted = 0 
    AND s.IsCompleted = 0 
    AND r.ROStatus  <> 'V'

SELECT DISTINCT
    c.CustomerId, c.CompanyId, c.CompanyName,
    c.FirstName, c.MiddleName, c.LastName, c.Suffix, 
    c.Phone1, c.Phone2, c.Email,
    si.ROId, si.RONo, si.ItemId, si.Repair, si.Problem, 
    si.Solution, si.CalculatedHrs, si.ActualStartDateTime, si.IsCompleted,
    si.CompletedDate, si.ActualEndDateTime, si.StatusId, si.RepairNo,
    si.ROStatusId, si.Name, si.IsActive, si.Description 
INTO
    #CustomerService 
FROM
    #ServiceItem si  
LEFT JOIN
    #Customer c ON si.ROId = c.ROId

SELECT 
    ROStatusId, name, Description 
INTO
    #RoStatus
FROM
    tbl_ROStatus

SELECT
    cs.ROId, cs.RepairNo, cs.RONo,
    (cs.FirstName + ' ' + cs.LastName) AS CustomerName,
    cs.Name, cs.Repair,
    ru.Make, ru.Model, cs.ItemId, cs.IsCompleted, ros.Name AS 'Status'
FROM
    #CustomerService cs 
LEFT JOIN
    #ROUnits ru ON ru.ROId = cs.ROId
LEFT JOIN
    #RoStatus ros ON ros.ROStatusId =cs.StatusId
ORDER BY 
    RONo

DROP TABLE #ROUnits, #Customer, #ServiceItem, #CustomerService, #RoStatus

【问题讨论】:

  • 将所有参数设置为 NULL 或 0 或某个默认值,尝试仅使用名称 EXEC YourSPName 运行存储过程,看看是否可以看到列结构?如果不先修复它,它将被修复。
  • EF 无法发现输出列,因为对临时表的选择。只需在 EDMX 设计器中自己构建一个返回实体类型。

标签: sql-server tsql stored-procedures entity-framework-6 complextype


【解决方案1】:

将所有参数设置为 NULL 或 0 或某个默认值,尝试仅使用名称 EXEC YourSPName 运行存储过程,看看是否可以看到列结构?如果不先修复它,它将被修复

示例代码:

CREATE PROCEDURE [dbo].[CustOrdersDetail] 
@OrderID INT = 0
AS
SELECT * FROM Products P, [Order Details] Od
WHERE Od.ProductID = P.ProductID and Od.OrderID = @OrderID
GO

EXEC [dbo].[CustOrdersDetail] 

【讨论】:

  • 好的,我进行了更改,但仍然没有。我可以在没有参数的情况下执行我的存储过程,并且在 SSMS 中它给了我列标题,但在“编辑函数导入”中,我仍然得到“选定的存储过程或函数不返回任何列”。我什至尝试从 EDMX 中删除存储过程并读取它,但仍然没有复杂类型。
【解决方案2】:

在查询开始之前使用 SET FMTONLY ON 并再次刷新实体模型。
在存储过程中有许多选择的复杂查询中,我在使用实体框架时也会遇到这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-29
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2016-11-01
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多