2014-11-03 47 views
1

我正在使用NPoco ORM(PetaPoco的一個分支),但我剛剛注意到它在某些情況下錯誤地映射了列。爲什麼NPoco忽略列和屬性名稱和映射幾乎是隨機的?

我使用一個存儲過程,我的POCO屬性名稱是相同的存儲過程中產生的列名:

string sql = "EXEC API_GetVenueSummaryByID @@venueID = @venueID"; 
var venue = db.FirstOrDefault<VenueSummary>(sql, new { venueID = venueID }); 

存儲過程是包含幾個變量簡單的SELECT語句(刪除它們沒有幫助):

DECLARE @hasOffers bit 
IF EXISTS(SELECT * FROM Offers WHERE dbo.Offers.EntryType='V' AND Offers.EntryID = @VenueID AND GETDATE() <= validToDate) SET @hasOffers = 1 

SELECT 
    Venue.VenueID, VenueName, Town, County, Country, PackageCode,  
    MeetingRoomsNo, MaxMeetingCapacity, BedroomsNo, 
    MetaDescription AS ShortDescription, 
    'dummyresult.jpg' AS PrimaryImageFilename, 
    @hasOffers AS HasSpecialOffers, 
    CAST(TimeStamp AS BIGINT) AS RecordVersion 
FROM dbo.Venue 
WHERE Venue.VenueID = @VenueID 

NPoco中有一個函數,它導致它猜測映射(忽略它們的名稱)嗎?如果是這樣,我該如何禁用這個功能,並強制它只根據列名和屬性名進行匹配?

目前唯一的解決辦法似乎是使用列屬性 < - 無法正常工作或

目前,甚至有人自動格式化的存儲過程(或任何變化這導致列順序的改變)正在破壞應用程序。

編輯2

我發現,如果我重新啓動該網站的應用程序(例如,通過編輯web.config文件或更新應用程序代碼),則列順序自我修復。所以我只能假設問題與NPoco內部緩存列索引有關 - 並且如果索引更改,則映射將不正確。我不確定是否有機制來清除可能無法正常工作的緩存?

+0

向我們顯示'API_GetVenueSummaryByID'。 – BCdotWEB 2014-11-03 10:25:28

+0

@BCdotNET更新爲包含存儲過程。 – NickG 2014-11-03 11:11:37

+0

我對NPoco並不熟悉,但我確實注意到他們有一些[使用存儲過程的示例](https://gist.github.com/litera/11205851)。另外還有[NPoco.StoredProcedures](https://www.nuget.org/packages/NPoco.StoredProcedures/)。你有沒有嘗試過這些? – BCdotWEB 2014-11-03 11:17:06

回答

1

這是NPoco(和PetaPoco)如何緩存用於從SQL語句映射到POCO的代碼的問題。

通常,如果您在更改SQL時更改代碼,因爲緩存將會重建,但是如果您先創建POCO,那麼在第一次初始運行映射後開始更改SP將是不正確的。

此問題現已在2.5.83-beta版中修復,現在將查看列名及其位置以確定緩存鍵。

感謝您的幫助@NickG

相關問題