1

Code First を使用していて、ストアド プロシージャを呼び出して、クラスの 1 つにマップしようとしています。コンポーネントの詳細を、PartsPath と MyPath の階層情報とともに返すストアド プロシージャ BOMComponentChild を作成しました。このストアド プロシージャの出力用のクラスがあります。PartsPath と MyPath の 2 つの列を除くすべてが正しくマップされ、これら 2 つのプロパティが Nothing になるという問題があります。私は周りを検索し、私の理解から、マッピングはEntity Framework名のマッピングをバイパスし、列名をプロパティ名に使用します。名前は同じで、なぜこの 2 つの列だけなのかわかりません。

ストアド プロシージャの最後の部分は次のとおりです。

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()

Management Studio でストアド プロシージャを実行すると、列は正しく、null ではありません。これらはストアドプロシージャの重要な情報であるため、これらがマップされない理由がわかりません。PartsPath と MyPath の型は varchar(50) です。

編集

そのため、これらの柱と他の柱の唯一の違いは、それらがキャストで作られていることであることに気付きました。最終選択でそれらを静的文字列に置き換えたところ、正しくマップされました。最後の選択を「テスト」に置き換えると、値がマップされます。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 
        ...
4

1 に答える 1

0

私の無限の知恵では、クエリでパラメーター PathPrefix のデフォルトを「/」に設定しましたが、PathPrefix を DBNull として渡していました。これは、値を渡さないことと同じではありません。そのため、クエリを通じて NULL が伝播されました。

誰かの時間を無駄にしたらごめんなさい。

于 2012-10-31T14:50:40.787 に答える