Entity Framework 迁移脚本不适用于 firebirdsql

Entity Framework migration script not working with firebirdsql

我正在使用 EF MigrationsFirebirdsql 数据库,当我在 VS 中使用 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
;

如果我尝试 运行 它 returns

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

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 Entity Framework 支持)生成语句(如图所示)的方式。

例如,您的脚本应如下所示:

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 本身生成脚本的方式)。