Возвращение количества записей, обновленных в Telerik Entity Framework из PostgreSQL

У меня есть хранимая процедура в 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];

        }
    }

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

Другие вопросы по тегам