更新列类型并使用非SQL代码更新数据

时间:2015-04-03 10:52:32

标签: c# json entity-framework json.net

我有一个Result个对象的表(称为Results)。目前,此表的一列是名为string的{​​{1}}类型,表示C#对象的Json序列化(使用Json.NET)。

由于导致数据库查询超时的这些对象的大小出现问题,我想将此列更改为ResultsData,并保留对象的Bson序列化。但是,当我更改类型时,添加迁移并运行它,可以理解崩溃,因为byte[]对象没有隐式转换为string。出于参考,迁移的byte[]方法如下所示:

Up()

我应该提一下,这里的任何数据丢失都是不可接受的。

现在,我可以处理将单个字符串转换为字节数组的代码,并且它将在我们称之为public override void Up() { AlterColumn("dbo.Results", "ResultsData", c => c.Binary()); } 的方法中。我不确定的是我如何在数据库的每一行调用此方法。

我在这里找到的最接近的答案是这个问题的第一个答案:EF5 Code First - Changing A Column Type With Migrations。但是,在这种情况下,转换代码完全在SQL中完成,这显然不适用于此。

如果有人对我如何做到这一点有任何想法,我们将不胜感激。如果有帮助的话,运行的实体框架I的版本是6.1.3。

修改

出于绝望,我尝试将实际的转换代码放入SQL方法中:没有预料到它会起作用,而且它没有产生错误byte[] ConvertResult(string resultsData)

Incorrect syntax near 'END'

编辑2

根据DrewJordan的要求,这里是public override void Up() { AddColumn("dbo.Results", "ResultsDataTmp", c => c.Binary()); Sql(@" UPDATE dbo.Results SET ResultsDataTmp = Service.ConvertOldResultsToBinary(ResultsData) END "); DropColumn("dbo.Results", "ResultsData"); RenameColumn("dbo.Results", "ResultsDataTmp", "ResultsData"); } 的实施。

Serial.ConvertOldResultsToBinary

1 个答案:

答案 0 :(得分:0)

您的第一次修改是在正确的轨道上,您需要在SQL中转换为二进制,但是您无法在调用Sql()时调用C#代码,因为您已将其告知只需运行您作为SQL命令传递的字符串。

尝试这样的事情:

public override void Up()
{
    AddColumn("dbo.Results", "ResultsDataTmp", c => c.Binary());
    Sql(@"
    UPDATE dbo.Results
    SET ResultsDataTmp = CAST(ResultsData AS VARBINARY(MAX))
        END
    ");
    DropColumn("dbo.Results", "ResultsData");
    RenameColumn("dbo.Results", "ResultsDataTmp", "ResultsData");
}