Возвращение количества записей, обновленных в 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];
}
}
У кого-нибудь есть идея получше?