Entity Framework 迁移脚本不适用于 firebirdsql
Entity Framework migration script not working with firebirdsql
我正在使用 EF Migrations 和 Firebirdsql
数据库,当我在 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 本身生成脚本的方式)。
我正在使用 EF Migrations 和 Firebirdsql
数据库,当我在 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 本身生成脚本的方式)。