【问题标题】:Entity Framework Code First Migrations and Firebird实体框架代码优先迁移和 Firebird
【发布时间】:2017-10-31 03:48:47
【问题描述】:

我正在尝试在 Firebird 2.5 数据库上启用迁移。

我正在使用 VS2015,并且 ADO 驱动程序和实体提供程序已安装并正常工作。

我对数据库进行了逆向工程,进行了必要的更改以使其正常工作。

我可以在包管理器控制台上启用迁移,并添加迁移。

当我更新数据库时会发生这种情况:

PM> update-database 
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201705301505265_Initial].
Applying explicit migration: 201705301505265_Initial.

ScriptHalted

如果我做一个 update-database -Verbose 我得到这个:

PM> update-database -Verbose
Using StartUp project 'Visao.Web'.
Using NuGet project 'Visao.Data'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'D:\Upwork\Fernando\SIGECOM.FDB' (DataSource: localhost, Provider: FirebirdSql.Data.FirebirdClient, Origin: Configuration).
Applying explicit migrations: [201705301505265_Initial].
Applying explicit migration: 201705301505265_Initial.
INSERT INTO "__MigrationHistory"("MigrationId", "ContextKey", "Model", "ProductVersion")
VALUES (CAST(_UTF8'201705301505265_Initial' AS VARCHAR(150)), CAST(_UTF8'Visao.Data.Migrations.Configuration' AS VARCHAR(300)), x'1F8B0800000000000400ECBDDD92DC3

还有很多字符,因为它试图将 blob 添加到数据库中。

__MigrationHistory 数据库已添加到 FDB 文件中:

所以我想这有点工作。

我不知道下一步该做什么,有人吗?

编辑

由于似乎一切都已创建,我认为错误可能来自迁移表上的插入。 也许是一个错误?

编辑 2

created an SQL script 使用 Update-Database -Script 并尝试在 IBExplorer 上运行并得到以下错误:

can't format message 13:896 -- message file C:\WINDOWS\firebird.msg not found.
Dynamic SQL Error.
SQL error code = -104.
Unexpected end of command - line 1, column 226.

即使只运行 Insert 语句也不起作用。

编辑 3

在他们的追踪器中创建一个issue,看看其他人是否知道

编辑 4

Bug Tracker 页面的负责人似乎一直在删除错误。

无论如何,如果我更改提供程序,无论是 MSSQL 还是 MySQL,迁移都会起作用。

编辑 5

这是创建的第一个迁移。它是空的,因为我正在尝试使用已填充的现有数据库,现在我想使用 Code First。

public partial class Initial : DbMigration
    {
        public override void Up()
        {
        }

        public override void Down()
        {
        }
    }

【问题讨论】:

  • 您的问题是,现在一切都已完成,并且正在按照您应该对数据库执行的操作?
  • @RandRandom 不,我的问题是如何使迁移工作,它们没有被正确提交。
  • 不确定是否受支持。见here
  • “命令行意外结束 - 第 1 行,第 226 列。” - 让我觉得 HEX 文字 - x'012345678.....DEF' 太长了,在中间被剪掉了,28C0B00', CAST(_UTF8'6.1.3-40302' AS VARCHAR(32))) 的结尾部分在 SQL CORE 中不存在。最大脚本长度、最大语句长度或最大 VARCHAR 长度限制 (firebirdsql.org/refdocs/langrefupd25-hexbinstrings.html) 存在实现限制,并且您似乎刚刚达到了一个。声明的结尾似乎刚刚被切断。 Ergo - 不要使用文字,使用参数:-D
  • 我唯一确定的是二进制字符串超出了实现限制(该字符串为 106112 个字符,而 Firebird 2.5 的字符串文字限制为 32K,整个查询字符串的限制为 64K(Firebird 3允许 10MB 查询字符串,尽管文字仍然限制为 32K)。错误的位置 226 是字符串文字的开头引号,因此命令意外结束:解析器在放弃之前回溯到该位置。但同样,最好把它放到邮件列表中;我有一段时间没在 SO 上看到 Jiri。

标签: c# entity-framework ef-code-first firebird


【解决方案1】:

正如 Mark Rotteveel 所说(他应该得到这个答案的分数)。您正在达到 Firebird 中语句大小的限制。我无能为力,因为这需要是脚本(即使它是直接执行的),所以参数不起作用。

可能的解决方法是创建多个较小的模型并将它们用于迁移。或者总是将脚本生成到文件中并手动使用参数。

【讨论】:

  • 是否有可能代替一次插入来生成插入,然后进行多次更新以将其余数据连接到 blob?
  • 这就是我想知道的。小迁移的问题在于,最终它会变得大到足以再次崩溃。所以一定有另一种方式,对吧?
  • @MarkRotteveel 可能是的。立即弹出的问题是更新集完成了一半。
  • @BrunoXavier 这不是关于迁移,而是关于模型。
  • 是的。我更担心从脚本手动执行(这是有效且受支持的场景)。我为它创建了一张票 (tracker.firebirdsql.org/browse/DNET-769),以保留参考。
猜你喜欢
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
相关资源
最近更新 更多