【问题标题】:Use custom logic in EF Code First migration在 EF Code First 迁移中使用自定义逻辑
【发布时间】:2014-08-22 00:08:57
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案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 标准加密。

    ufn 可以通过 n Sql 调用来创建。

    【讨论】:

    • AFAIK,标准 SQL 加密不适用于 EF Code First。我的意思是我无法获得已经解密的模型,但需要通过 SQL 查询解密每个值,这在我的情况下是不可接受的。似乎,CLR UDF 是唯一的方法......悲伤。
    • 从来没有读过代码优先和 T-SQL 加密。但是 AFAIK,您可以在 T-SQL 中编写所有代码,而不是经常需要 CLR UDF。你打算用什么加密?
    • 我想将 RSACryptoServiceProvider 与存储在命名密钥容器中的密钥一起使用,如图所示 here
    • 不,我没有,但它看起来不太有希望。从密钥容器创建非对称密钥似乎是不可能的。这意味着我需要在工作站上的某个位置放置带有关键参数的文件,以便在迁移期间创建非对称密钥。
    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    相关资源
    最近更新 更多