2015-04-03 4 views
0

У меня есть хранимая процедура в PostgreSQL определяется как:Возвращаясь количество записей обновленных в Telerik Entity Framework с 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 DataAccess вызывается для обновления домена из базы данных, он компилирует это как:

[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]; 

     } 
    } 

Кто-нибудь есть идея получше?

Смежные вопросы