1

코드 우선을 사용하고 있으며 저장 프로 시저를 호출하여 클래스 중 하나에 매핑하려고합니다. PartsPath 및 MyPath에서 계층 구조 정보가있는 구성 요소의 세부 정보를 반환하는 저장 프로 시저 BOMComponentChild를 만들었습니다. 이 저장 프로 시저의 출력을위한 클래스가 있습니다. 두 개의 열 (PartsPath 및 MyPath)을 제외한 모든 항목이 Nothing으로 끝나는 두 속성으로 올바르게 매핑되는 문제가 있습니다. 필자는 매핑을 검색하여 Entity Framework 이름 매핑을 무시하고 속성 이름에 열 이름을 사용합니다. 이름이 같고 왜이 두 열만 있는지 확실하지 않습니다.Entity Framework에서 저장 프로 시저를 호출하는 SqlQuery의 열 두 개를 매핑하지 않습니다.

SELECT t.ParentID 
     ,t.ComponentID 
     ,c.PartNumber 
     ,t.PartsPath 
     ,t.MyPath 
     ,t.Layer 
     ,c.[Description] 
     ,loc.LocationID 
     ,loc.LocationName 
     ,CASE WHEN sup.SupplierID IS NULL THEN 1 ELSE sup.SupplierID END AS SupplierID 
     ,CASE WHEN sup.SupplierName IS NULL THEN 'Default' ELSE sup.SupplierName END AS SupplierName 
     ,c.Active 
     ,c.QA 
     ,c.IsAssembly 
     ,c.IsPurchasable 
     ,c.IsMachined 
     ,t.QtyRequired 
     ,t.TotalQty 

FROM BuildProducts      t 
     INNER JOIN [dbo].[BOMComponent]  c  ON c.ComponentID = t.ComponentID   
     LEFT JOIN [dbo].[BOMSupplier]  bsup ON bsup.ComponentID = t.ComponentID AND bsup.IsDefault = 1 
     LEFT JOIN [dbo].[LookupSupplier] sup  ON sup.SupplierID = bsup.SupplierID 
     LEFT JOIN [dbo].[LookupLocation] loc  ON loc.LocationID = c.LocationID 
WHERE 
     (@IsAssembly IS NULL OR IsAssembly = @IsAssembly) 
ORDER BY 
     t.MyPath 

와 클래스가되는 매핑 :

저장 프로 시저의 마지막 부분은 내가 같이 호출하려고

Public Class BOMComponentChild 

     Public Property ParentID As Nullable(Of Integer) 
     Public Property ComponentID As Integer 
     Public Property PartNumber As String 
     Public Property MyPath As String 
     Public Property PartsPath As String 
     Public Property Layer As Integer 
     Public Property Description As String 
     Public Property LocationID As Integer 
     Public Property LocationName As String 
     Public Property SupplierID As Integer 
     Public Property SupplierName As String 
     Public Property Active As Boolean 
     Public Property QA As Boolean 
     Public Property IsAssembly As Boolean 
     Public Property IsPurchasable As Boolean 
     Public Property IsMachined As Boolean 
     Public Property QtyRequired As Integer 
     Public Property TotalQty As Integer 

     Public Property Children As IDictionary(Of String, BOMComponentChild) = New Dictionary(Of String, BOMComponentChild) 

    End Class 

:

Me.Database.SqlQuery(Of BOMComponentChild)("EXEC [BOMComponentChild] @ComponentID, @PathPrefix, @IsAssembly", params).ToList() 

관리 Studio에서 저장 프로 시저를 실행할 때 열은 정확하고 null이 아닙니다. 저장 프로 시저에서 중요한 정보이므로 매핑되지 않는 이유를 파악할 수 없습니다. PartsPath 및 MyPath의 유형은 varchar (50)입니다.

편집 그래서 나는 그 기둥과 다른 사람 사이의 유일한 차이는 그들이 캐스트로 만든 것을 깨달았다. 나는 그들을 정적 문자열로 끝내고 그들을 바꿨고 올바르게 매핑되었다. 마지막 선택을 'test'로 바꿨을 때 값이 매핑됩니다. CAST가 SQL 쿼리에서 올바르게 표시되는 경우 CAST가 잘못되었습니다. 나의 무한한 지혜에서

;WITH BuildProducts (ParentID, ComponentID, PartNumber 
        ,PartsPath, MyPath, QtyRequired, TotalQty, Layer) 
AS 
(
    SELECT ... 
      ,@PathPrefix      AS PartsPath 
      ,CAST(@PathPrefix + 
        CAST(ComponentID   AS varchar(4)) + 
        '/'       AS varchar(50) 
       )        AS MyPath 
      ,... 
    FROM [dbo].[BOMComponent]    
    WHERE ... 

    UNION ALL 

    SELECT ... 
      ,CAST(b.PartsPath + 
        CAST(a.ParentID    AS varchar(4)) + 
        '/'       AS varchar(50) 
       )        AS PartsPath 
      ,CAST(b.PartsPath + 
        CAST(a.ParentID    AS varchar(4)) + 
        '/'           + 
        CAST(a.ComponentID   AS varchar(4)) + 
        '/'       AS varchar(50) 
       )        AS MyPath 
      ,... 
    FROM [dbo].[BOMAssembly]    a 
      INNER JOIN [dbo].[BOMComponent] c ON a.ComponentID = c.ComponentID 
      ... 
) 

SELECT -- t.PartsPath 
     --,t.MyPath 
     'test' As PartsPath 
     ,'test' As MyPath 
     ,... 

FROM BuildProducts      t 
     ... 

답변

0

은 내가 값을 전달하지 동일하지 않습니다 DBNull이로 Pathprefix를 전달했다, 그러나, 내 질문에 '/'로 매개 변수 Pathprefix를 기본했다. 따라서 NULL은 쿼리를 통해 전파됩니다.

죄송합니다. 누군가의 시간을 낭비하면 죄송합니다.

관련 문제