簡體   English   中英

按要求處理的 EF Core 可選色譜柱

[英]EF Core Optional Column Treated As Required

我需要從 EF Core 調用的存儲過程中讀取結果,其中包括用於電子表格格式化目的的內容,例如只有空值的行。 我的代碼大部分都在工作,但是當我包含它們時,有兩列會導致查詢失敗。

這是我的模型類(為簡潔起見,僅包含一些道具):

public class StoredProcRecord
{
    [Column("Prod Line")]
    public string ProductLine { get; set; }

    [Column("Current Sales")]
    public decimal? CurrentSales { get; set; }

    [Column("Current Margin $")]
    public decimal? CurrentMargin { get; set; }
}

如果我從 SQL Server Management Studio 運行存儲過程,下面是部分輸出的片段:

存儲過程輸出

以下是我在 db 上下文中使用 EF Core 將該類型注冊為實體模型的方法:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Query<StoredProcRecord>();
}

這是我調用存儲過程的方式:

return _context.Query<StoredProcRecord>().FromSql("EXECUTE my_stored_proc").ToList();

在此示例中,EF Core 在嘗試調用FromSql()時總是拋出異常並顯示以下消息:

'FromSql' 操作的結果中不存在所需的列 'Current Margin $'。

根據EF Core docs ,只要一列可以為空,就不需要。 然而,我收到了聲稱需要“當前保證金 $”的例外情況。 它也只發生在CurrentMargin屬性上,而不是使用相同類型的CurrentSales屬性。 如果我刪除CurrentMargin ,整個事情都可以正常工作,而我只是缺少那個屬性。

我嘗試使用[Column(Order = 2)]而不是命名列,認為列名中的美元符號可能與它有關,但這導致:

'FromSql' 操作的結果中不存在所需的列 'CurrentMargin'。

包含 order 和 name 會導致相同類型的錯誤。

值得注意的是,這不是我可以選擇對其進行更新的存儲過程。

與導致它像這樣失敗的CurrentSales相比, CurrentMargin屬性有什么不同? 是否有一些特殊的方法需要處理列名中的美元符號? 我是否完全錯過了其他東西?

編輯:

這是存儲過程最后的一個片段,其中輸出了結果表。 我將其包括在內以表明“當前保證金 $”確實是列名稱之一。 我實際上是從存儲過程中直接復制/粘貼的,只是為了確保我沒有輸入錯誤的列名。

BEGIN
-- bulk of stored procedure that builds #tmp_tbl omitted for length
SELECT 
'Prod Line'          = pl_key,
'Current Sales'      = curr_sales,
'Current Margin $'   = curr_margin
FROM #tmp_tbl
END

這個問題令人尷尬的答案是確保你仔細閱讀你的代碼,尤其是像字符串值這樣的東西。

在這種情況下,我有兩個最終會被我的應用程序使用的存儲過程, bv_xls_profit_sum_v2bv_xls_prod_sum_v2 我正在實現對第一個存儲過程結果的使用,但我不小心將第二個存儲過程的名稱提供給了 EF。 這兩個列不匹配,所以我收到的關於缺少 required 列的錯誤不是關於該列是否可以為空,而是實際上是結果集中確實完全缺少該列的情況。 通過 SQL Server Management Studio 進行測試時,這並不明顯,因為我沒有意識到我正在運行不同的存儲過程。

獎勵“答案”:

在找出我的愚蠢錯誤之前,我確實想出了一個解決方法,我會離開這里以防萬一它對任何人有用。 我的應用程序有自己的 SQL Server 實例,但也查詢另一個不受應用程序控制的 SQL Server 實例(這是有問題的存儲過程所在的位置)。 為了解決我一直在努力解決的問題,我將另一個 SQL Server 實例連接到我的作為鏈接服務器。 然后我復制了我想調用的存儲過程,更新它以查詢鏈接服務器,消除不需要的空行,並使用列名返回以匹配我的模型類。 這確實有效並允許我管理存儲過程,盡管它可能會增加額外的延遲以從查詢修改后的存儲過程中獲取結果集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM