Скрипт миграции Entity Framework не работает с firebirdsql

Я использую EF Migrations с базой данных Firebirdsql, и она отлично работает, пока я обновляю базы данных с помощью PackageManagerConsole в VS.

Если я использую

Update-Database -Script

а потом пытаюсь запустить скрипт получаю ошибку.

После небольшого тестирования я думаю, что это ломается с этими предложениями

EXECUTE BLOCK
AS
BEGIN
    if (not exists(select 1 from rdb$generators where rdb$generator_name = 'GEN_IDENTITY')) then
    begin
        execute statement 'create sequence GEN_IDENTITY';
    end
END
;

CREATE OR ALTER TRIGGER "ID_Users_Id" ACTIVE BEFORE INSERT ON "Users"
AS
BEGIN
    if (new."Id" is null) then
    begin
        new."Id" = next value for GEN_IDENTITY;
    end
END
;

Если я попытаюсь запустить, он вернется

ISC ERROR MESSAGE: Dynamic SQL Error SQL error code = -104 Unexpected
end of command - line 6, column 21

person MaLKaV_eS    schedule 21.06.2016    source источник
comment
Возможно глюк провайдера. Вы используете текущую версию? Не знаком с синтаксисом firebird, но, возможно, поэкспериментирую с точкой с запятой рядом с сообщением об ошибке. Аналогично без ответа: stackoverflow.com/questions/30781748/   -  person Steve Greene    schedule 21.06.2016
comment
Да. Генерация сценария не обрабатывает операторы SET TERM. Не стесняйтесь добавить тест-кейс в трекер. Не уверен, как я все это подключу, потому что выполнение имеет одинаковый путь, и там это для каждого оператора.   -  person cincura.net    schedule 21.06.2016


Ответы (1)


Firebird ожидает, что будет выполнен один оператор, поэтому большинство инструментов (например, ISQL, flamerobin) будут разбиваться на точку с запятой и отправлять отдельные части в виде операторов. В этом случае это не удается, потому что тогда будет выполнен следующий оператор:

EXECUTE BLOCK
AS
BEGIN
    if (not exists(select 1 from rdb$generators where rdb$generator_name = 'GEN_IDENTITY')) then
    begin
        execute statement 'create sequence GEN_IDENTITY'

И это явно неполно, и поэтому возникает ошибка Неожиданный конец команды. Чтобы решить эту проблему, большинство инструментов Firebird ожидают, что инструкция set term переключится на другой терминатор операторов (например, # вместо ;). Сам установленный термин не понимается сервером Firebird.

Способ, которым инфраструктура сущностей (или поддержка Entity Framework Firebird) генерирует операторы (как показано), не может использоваться этими инструментами.

Например, ваш скрипт должен выглядеть примерно так:

set term #;
EXECUTE BLOCK
AS
BEGIN
    if (not exists(select 1 from rdb$generators where rdb$generator_name = 'GEN_IDENTITY')) then
    begin
        execute statement 'create sequence GEN_IDENTITY';
    end
END
#

CREATE OR ALTER TRIGGER "ID_Users_Id" ACTIVE BEFORE INSERT ON "Users"
AS
BEGIN
    if (new."Id" is null) then
    begin
        new."Id" = next value for GEN_IDENTITY;
    end
END
#
set term ;#

Вы не указали, какую версию Entity Framework и драйвер Firebird Entity Framework вы используете. Я бы посоветовал вам сначала попробовать обновить драйвер. В противном случае я предлагаю вам сообщить об ошибке на странице http://tracker.firebirdsql.org/browse/DNET. но я не уверен, что это проблема, которую можно исправить там (это также может быть то, как сама Entity Framework генерирует скрипт).

person Mark Rotteveel    schedule 21.06.2016
comment
Извините, до сих пор отсутствовал весь день за компьютером. Я использую EF 6.1.3 и последнюю версию FirebirdClient (обновлено сегодня с 5.0.0, чтобы узнать, связано ли это). Я проверю это завтра и позволю вам сейчас. - person MaLKaV_eS; 21.06.2016