структура сущности + база данных преимуществ: UDF - PullRequest
0 голосов
/ 25 августа 2010

Я использую 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;NativeError = 2117;[Решения iAnywhere] [Advantage SQL Engine] Неожиданный токен: имя скалярной функции не должно быть разделено.

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 26 августа 2010

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

0 голосов
/ 25 августа 2010

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

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

...