1

我正在使用 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 内部缓存列索引有关——如果索引发生变化,那么映射将不正确。我不确定是否有清除缓存的机制可能不起作用?

4

1 回答 1

1

这是 NPoco(和 PetaPoco)如何缓存用于从 SQL 语句映射到 POCO 的代码生成的问题。

如果您在更改 SQL 时更改代码,通常这不是问题,因为缓存将被重建,但是如果您先创建 POCO,然后在第一次初始运行后开始更改 SP,则映射将不正确。

此问题现已在 2.5.83-beta 中得到修复,它现在将查看列名及其位置来确定缓存键。

感谢@NickG 的帮助

于 2014-11-04T10:14:08.240 回答