Entity Framework + Sql Anywhere 11 + Хранимые процедуры - PullRequest
2 голосов
/ 13 июня 2009

Я играл с EF в последние пару дней. Наши приложения основаны на базах данных SQL Anywhere 10, и весь наш доступ к данным осуществляется через хранимые процедуры. Поскольку EF не поддерживается SA 10, я тестирую EF с SA 11. Для этого я создал небольшую базу данных с двумя таблицами и парой хранимых процедур (на основе базы данных nerddinner из примеров mvc asp.net, см. здесь ) Я создал модель из базы данных, таблиц и хранимых процедур и выполнил необходимые функции импорта. У меня есть хранимая процедура со следующей подписью:

ALTER PROCEDURE "DBA"."get_dinner"( @dinner_id integer)
BEGIN
select dinner_id, title, event_date, description, hosted_by , contact_phone, address, country, latitude, longitude
from dba.dinners d
where d.dinner_id = @dinner_id
END

И полученный код импорта функции выглядит так:

public global::System.Data.Objects.ObjectResult<dinner> get_dinner(global::System.Data.Objects.ObjectParameter dinner_id)
{
    return base.ExecuteFunction<dinner>("get_dinner", dinner_id);
}

И в этом проблема. В идеале сгенерированный код должен принимать параметр int вместо global::System.Data.Objects.ObjectParameter dinner_id Насколько я вижу, в файле edmx есть все данные, необходимые для правильной интерпретации типов параметров:

<Function Name="get_dinner" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="DBA">
  <Parameter Name="dinner_id" Type="int" Mode="InOut" />
</Function>

Я что-то здесь упускаю? Что еще нужно для импорта функции с правильным типом параметра? Это можно исправить, настроив файл edmx, или это проблема реализации поддержки SA11 EF.

Надеюсь, кто-нибудь может дать мне некоторые дополнительные подсказки.

1 Ответ

1 голос
/ 13 июня 2009

Это известная проблема с параметрами InOut и генерацией кода для импорта функций.

Мы говорили о том, чтобы параметры InOut производили код, подобный этому:

public ObjectResults<dinner> get_dinner(ref int dinner_id);

Вместо того, что у вас есть.

Одна вещь, которую нужно попробовать, - это преобразование из параметра InOut в параметр In. Затем код gen должен создать что-то вроде этого:

public ObjectResults<dinner> get_dinner(int dinner_id);

Реальный вопрос в том, работает ли он, если вы его называете?

Надеюсь, этот фон поможет

Приветствия

Alex

...