2015-04-03 75 views
0

更新Telerik的實體框架的記錄數爲:返回從PostgreSQL的

CREATE OR REPLACE FUNCTION g_changename(oldname character varying, newname character varying) 
    RETURNS integer AS 
$BODY$ 
    declare 
     k integer :=0; 
    begin  
     UPDATE test SET name = $2 WHERE name = $1; 
     GET DIAGNOSTICS k = ROW_COUNT; 
    return k; 
    end;  
$BODY$ 
LANGUAGE plpgsql VOLATILE 
COST 100; 
ALTER FUNCTION g_changename(character varying, character varying) 
OWNER TO postgres; 

的存儲程序測試正確地返回更新的記錄數時

Select g_changename('a','b'); 
在PgAdmin內執行

。當數據訪問Telerik的調用來更新從數據庫中域,它編譯此爲:

[MappedFunctionAttribute(Name="\"public\".\"g_changename\"", IsDeterministic=false, Backend=Backend.PostgreSql)] 
    public static Int32 ChangeName(string oldname, string newname) 
    { 
     throw new NotImplementedException(); 
    } 

其中,從所有我看過,似乎是適當的。但是,你會如何編寫一個方法來調用它?

這將失敗,因爲它調用未實現的靜態方法:

public int ChangeName(string OldName, string NewName) 
    { 
     var x = Nova.Data.Data.ChangeName(OldName, NewName); 
     return x; 
    } 

而且我不知道如何使用Telerik的元數據的「MappedFunctionAttribute」是指太。

任何幫助將不勝感激,因爲我現在已經掙扎了好幾天。

回答

1

看來,與標收益定義的存儲過程只能在LINQ語句中調用 - 只與非恆定的參數,然後。所以,我可以工作了這一點,最簡單的方法是繞過完全模板方法(即沒有實現),直接進入到數據庫:

public int ChangeName(string OldName, string NewName) 
    { 
     using (var ctx = new Nova.Data.Data()) 
     { 
      OAParameter p1 = new OAParameter(); 
      p1.ParameterName = "oldname"; 
      p1.Value = OldName; 

      OAParameter p2 = new OAParameter(); 
      p2.ParameterName = "newname"; 
      p2.Value = NewName; 

      IList<Int32> rslt = 
       ctx.ExecuteQuery<Int32>("g_changename", CommandType.StoredProcedure, p1, p2); 

      ctx.SaveChanges(); 

      return rslt[0]; 

     } 
    } 

任何人有一個更好的主意嗎?