4

我遇到了非常奇怪的问题。我在子项目中有带有迁移的控制台应用程序。我使用 .Net 4 和 EF 5。这是我的迁移:

            Sql(
            "INSERT [Script] ([Id], [CompanyId], [ScriptType], [ScriptCode], [Enable], [Schema]) VALUES (38500, 0, 3, N'if(Row.OccupancyCode == \"8500\") Row.MSBOccupancyId = 8500;', 1, N'SQA'), " +
            "(38510, 0, 3, N'if(Row.OccupancyCode == \"8510\") Row.MSBOccupancyId = 8510;', 1, N'SQA'), " +
            "(38535, 0, 3, N'if(Row.OccupancyCode == \"8535\") Row.MSBOccupancyId = 8535;', 1, N'SQA'); ");

当我像这样从 cmd 运行它时:

migrate.exe MSB.PI.Data.PortfolioInsight.dll /connectionString="数据源=服务器;用户=用户;密码=密码;初始目录=AAA;" /connectionProviderName="System.Data.SqlClient" /verbose

我收到:

详细:目标数据库是:'AAA'(数据源:evbyminsd1144,提供者:System.Data.SqlClient,来源:显式)。应用基于代码的迁移:[201304161824179_InsertBaseDataScripts]。应用基于代码的迁移:201304161824179_InsertBaseDataScripts。System.Data.Entity.Migrations.Design.ToolingException:输入字符串的格式不正确。在 System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner) 在 System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force) 在 System.Data.Entity.Migrations.Console。 System.Data.Entity.Migrations.Console.Program.Main(String[] args) 处的 Program.Run() 错误:输入字符串的格式不正确。

但所有陈述都是正确的。

有什么问题,请帮我解决这个问题。

提前致谢。

4

2 回答 2

1

黑客警告

原来我必须添加一个黑客来解决这个问题。

问题很可能是因为 migrate.exe 试图在某处执行 String.Format() 。

黑客:

  1. 创建一个 DbMigration 类并“新建”该Sql()函数,以便我们可以在传入原始 sql 之前对其进行转义System.Data.Entity.Migrations.DbMigration.Sql()
  2. 使用 unicode 转义 '{' 和 '}'

代码:

// This is a hack for:
//      https://stackoverflow.com/questions/16044838/when-i-run-ef-code-migration-from-console-input-string-was-not-in-a-correct-fo
// Without it migrate.exe will not work if you try to run Sql("Select '{'")
// 
// This is most likely because migrate.exe is trying to do String.Format() somewhere
public abstract class DbMigration : System.Data.Entity.Migrations.DbMigration
{
    protected internal new void Sql(string sql, bool suppressTransaction = false, object anonymousArguments = null)
    {
        base.Sql(Escape(sql), suppressTransaction, anonymousArguments);
    }

    // EF migrate.exe does not support any script with the character '{' or '}'
    // Encode them into unicode and add the strings on Sql server side
    private string Escape(string s)
    {
        return s.Replace("{", "'+NChar(123)+'").Replace("}", "'+NChar(125)+'");
    }
}

我尝试过但没有用的东西:

  1. 通过导入 EntityFramework.psm1 在 PowerShell 中运行 update-database。你会收到一条消息说The name of the current PowerShell host is 'ConsoleHost'。这是因为update-database使用了 NuGet 包管理器控制台中的一堆方法。在这里阅读更多
  2. 从 powershell 运行包管理器控制台。正如这里建议的那样,这很可能是不可能的
  3. 试图找出为什么 EntityFramework.psm1 中不存在问题并使用他们的解决方案。该脚本包含 500 行代码,实际上所做的不仅仅是触发 migrate.exe。破解它似乎更容易
于 2013-08-22T17:52:41.860 回答
0

我在迁移中解析原始 SQL 中的字符串时遇到了类似的问题。在 migrate.exe 下运行时,迁移中的以下有效 SQL 也会抛出“输入字符串格式不正确”:

Sql("SELECT '{'");

不过,它确实可以从包管理器控制台工作,因此似乎确实是 migrate.exe 的问题。

注意我使用的是 4.3.1。

一种选择可能是使用“-Scr​​ipt”参数从 Visual Studio 中的包管理器控制台运行迁移:

Update-Database -Script -SourceMigration:"MigrationBeforeProblemOne" -TargetMigration:"ProblemMigration"

这将允许您生成要运行的 SQL 脚本,而不是使用 migrate.exe,只是为了将此迁移到数据库中(从那时起,migrate.exe 将来可以跳过此特定迁移)。

于 2013-05-30T09:27:56.357 回答