структура сущностей + база данных преимуществ: пользовательские функции

Я использую VS2010, Entity Framework 4.0 и Advantage v. 10 в своем приложении. Я пытаюсь сделать UDF, который я определил в своей базе данных Advantage, доступной для кода моего приложения. Дизайнер не показывает UDF в хранимых процессах в мастере «Обновление модели из базы данных», как я ожидал. Поэтому я вручную добавил UDF в SSDL следующим образом:

    <Function Name="Test" ReturnType="numeric" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion">
      <Parameter Name="PartID" Type="integer" Mode="In"/>
    </Function>

Я также добавил заглушку метода CLR:

    [EdmFunction("namespace.Store", "Test")]
    public static decimal Test(int partID)
    {
        throw new InvalidOperationException("Call from within an L2E query");
    }

Я вижу функцию в своем заявлении Linq-to-Entities; однако сгенерированный SQL недействителен. При использовании ToTraceString вызов UDF выглядит примерно так:

    "namespace.Store"."Test"("Project3"."PartID") AS "C4"

Это дает мне следующую ошибку:

System.Data.EntityCommandExecutionException: произошла ошибка при выполнении определения команды. Подробности смотрите во внутреннем исключении. ---> Advantage.Data.Provider.AdsException: Ошибка 7200: Ошибка AQE: Состояние = 42000; Нативеррор = 2117; [Решения iAnywhere][Advantage SQL Engine]Неожиданный токен: имя скалярной функции не должно быть разделено.

Он отлично работает, если я запускаю сгенерированный SQL в Advantage Data Architect и исправляю имя функции следующим образом:

     Test("Project3"."PartID") AS "C4"

Есть ли способ указать Entity Framework для создания правильного SQL? Я что-то не так делаю в определении функции в SSDL?

Заранее спасибо.


person user429994    schedule 24.08.2010    source источник


Ответы (2)


Вам нужно изменить свой функциональный элемент, чтобы он имел BuiltIn="true". Пользовательские функции не указаны в грамматике Advantage SQL.

person LanceSc    schedule 25.08.2010
comment
Я пробовал много разных комбинаций свойств, но предположил, что BuiltIn означает нативные системные функции БД. Отличный материал! - person user429994; 26.08.2010

Это выглядит хорошо. Единственное, что я бы порекомендовал, это изменить десятичное число на обнуляемое, но я сомневаюсь, что это решит проблему, потому что тогда вы увидите другое исключение. стоит попробовать. Я уже рассказывал об этой функции некоторое время назад.

http://weblogs.asp.net/zeeshanhirani/archive/2010/04/08/calling-user-defined-database-function-from-linq.aspx

person zeeshanhirani    schedule 25.08.2010