0

我有一個具有一定數據量(即DB不爲空)的現有數據庫。現在我決定加密一些敏感數據。我有一列TemplateBlocks : string。我將用新的列TemplateBlocksEnc : byte[]替換它,並且確實更改了我的Code First模型。然後,我產生了遷移並卡住了!在EF 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

可以使用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。

+0

AFAIK,標準SQL加密不適用於EF Code First。我的意思是我無法獲得已解密的模型,但需要通過SQL查詢解密每個值,這在我的情況中是不可接受的。看來,CLR UDF是唯一的方式......悲傷。 –

+0

從來沒有讀過關於代碼第一和T-SQL加密。但是AFAIK,你可以在T-SQL中編寫所有代碼,而不是經常需要CLR UDF。你在計劃什麼加密? – tschmit007

+0

我想使用'RSACryptoServiceProvider'和一個存儲在命名密鑰容器中的密鑰,如[這裏]所示(http://msdn.microsoft.com/zh-cn/library/ca5htw4f%28v=vs.110%29.aspx ) –