我有一个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'
根据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
答案 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");
}