我正在使用 NPoco ORM(PetaPoco 的一个分支),但我刚刚注意到它在某些情况下会错误地映射列。
我正在使用存储过程,并且我的 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 内部缓存列索引有关——如果索引发生变化,那么映射将不正确。我不确定是否有清除缓存的机制可能不起作用?