我正在使用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內部緩存列索引有關 - 並且如果索引更改,則映射將不正確。我不確定是否有機制來清除可能無法正常工作的緩存?
向我們顯示'API_GetVenueSummaryByID'。 – BCdotWEB 2014-11-03 10:25:28
@BCdotNET更新爲包含存儲過程。 – NickG 2014-11-03 11:11:37
我對NPoco並不熟悉,但我確實注意到他們有一些[使用存儲過程的示例](https://gist.github.com/litera/11205851)。另外還有[NPoco.StoredProcedures](https://www.nuget.org/packages/NPoco.StoredProcedures/)。你有沒有嘗試過這些? – BCdotWEB 2014-11-03 11:17:06