在EF Code First迁移中使用自定义逻辑

时间:2014-07-01 12:19:56

标签: .net entity-framework ef-code-first database-migration ef-migrations

我有一个包含大量数据的现有数据库(即数据库不为空)。现在我决定加密一些敏感数据。我有一个专栏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() { /* ... */ }
}

当然,我不打算丢失任何现有数据,我需要从旧列读取所有数据,加密它,存储到新创建的列,然后才能删除旧列。

有可能吗?我想我需要以某种方式获得当前的连接/事务,但我不知道如何制作它。

1 个答案:

答案 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。