我有一个包含大量数据的现有数据库(即数据库不为空)。现在我决定加密一些敏感数据。我有一个专栏TemplateBlocks : string
。我将用新列TemplateBlocksEnc : byte[]
替换它,并且我正确地更改了我的Code First模型。然后我生成了迁移并且......卡住了!
public partial class EncryptTemplateBlocks : DbMigration
{
public override void Up()
{
AddColumn("dbo.Devices", "TemplateBlocksEnc", c => c.Binary(nullable: true));
// TODO: read TemplateBlocks data, encrypt, save to new column
AlterColumn("dbo.Devices", "TemplateBlocksEnc", c => c.Binary(nullable: false));
DropColumn("dbo.Devices", "TemplateBlocks");
}
public override void Down() { /* ... */ }
}
当然,我不打算丢失任何现有数据,我需要从旧列读取所有数据,加密它,存储到新创建的列,然后才能删除旧列。
有可能吗?我想我需要以某种方式获得当前的连接/事务,但我不知道如何制作它。
答案 0 :(得分:1)
您可以使用Sql
和transact-sql:
public partial class EncryptTemplateBlocks : DbMigration {
public override void Up()
{
AddColumn("dbo.Devices", "TemplateBlocksEnc", c => c.Binary(nullable: true));
// TODO: read TemplateBlocks data, encrypt, save to new column
Sql("UPDATE dbo.Devices SET TemplateBlocksEnc = ufn_Func(TemplateBlocks) WHERE TemplateBlocksEnc IS NULL");
AlterColumn("dbo.Devices", "TemplateBlocksEnc", c => c.Binary(nullable: false));
DropColumn("dbo.Devices", "TemplateBlocks");
}
public override void Down() { /* ... */ }
}
您还可以创建Transact-sql版本的加密或使用sql标准加密。
可以使用n Sql
调用创建ufn。