使用Postgresql的Dapper存儲過程沒有字母參數

c# dapper plpgsql postgresql stored-procedures

我試圖使用C#和Dapper調用用plpgsql編寫的Postgresql存儲過程,但我發現Dapper在將參數插入存儲過程之前按字母順序排列參數。有沒有辦法可以避免這種行為,並以正確的順序插入項目?

例如,以下調用將無法正確運行,因為它將按字母順序排列參數名稱。我必須手動按字母順序排列它們才能通過調用。

int map_id = conn.Query<int>(
"insert_color",
new
{
    zebra_name = new DbString { Value = slide_name },
    door_name = new DbString { Value = fov_name },
    foo_number = cycle_number,
    variable_path = new DbString { Value = image_path },
    random_path = new DbString { Value = meta_path },
    x = x,
    y = y,
    z = z,
    exposure = exposure,
    type_name = new DbString { Value = image_type },
    copy = copy
},
commandType: CommandType.StoredProcedure).First();

這是存儲過程聲明:

CREATE OR REPLACE FUNCTION insert_color(
zebra_name text, door_name text, foo_number integer,    
variable_path text, random_path text, 
x real, y real, z real, exposure real,
type_nametext, copy integer) RETURNS integer AS $$
    ...
$$ LANGUAGE plpgsql;

一般承認的答案

在內部,Dapper使用反射來獲取param對象的屬性。具體來說, GetProperies(...)問題,那些不能保證按特定順序排列......

GetProperties方法不以特定順序返回屬性,例如按字母順序或聲明順序。您的代碼不得依賴於返回屬性的順序,因為該順序會有所不同。

為了有點用處,他們選擇按字母順序排序參數,但不幸的是,沒有辦法確保參數按照你在課堂上的順序出現。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因