0

データベースでEF移行を使用していますが、VSFirebirdsqlを使用してデータベースを更新している間、問題なく動作します。PackageManagerConsole

私が使用する場合

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
4

1 に答える 1

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'

そして、これは明らかに不完全であるため、Unexpected end of commandエラーが発生します。この問題に対処するために、ほとんどの Firebird ツールは、set term命令が別のステートメント ターミネータ (たとえば#、 の代わりに;) に切り替わることを想定しています。設定された用語自体は、Firebird サーバーによって理解されません。

エンティティ フレームワーク (または 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 自体がスクリプトを生成する方法でもある可能性があります)。 .

于 2016-06-21T15:15:11.770 に答える