2013-02-04 40 views
9

我正在使用EF Code First項目,一切都很順利。我有一個簡單的類,客戶。在我的客戶類別中,我有一個要加密的字段(是的,我知道我可以在數據庫級別進行加密,但要求指定我在域/代碼級別進行加密),所以我希望我可以執行以下操作:實體框架代碼首先,非空setter或getter?

public class Customer 
{ 
    public int CustomerID { get; set; }  
    public string FieldToEncrypt { get; set { _FieldToEncrypt = MyEncryptionFunction.Encrypt(); } } 
} 

但是,我認爲如果setter有一個定義,實體框架代碼在生成模式時可能會首先忽略該屬性。所以我的問題是,有沒有辦法使用提供的getters/setter來執行EF Code First,還是應該將此功能移到構造函數中?我應該重寫上下文保存時發生的某個方法/事件嗎?

編輯* ** * ** * ** * ** * ** * ****

作爲一個說明,我使用DataService通過OData協議服務傳輸數據。這會自動生成插入/更新/選擇方法。一些建議需要創建第二個屬性,但DataService類似乎不通過NotMapped屬性。這在我之前的問題中引起了一些爭議。

+0

如果您正在對字符串進行加密,我建議儘可能地將它放在輸入附近。即你在哪裏做'FieldToEncrypt =「asdf」;'(在setter中處理加密),改爲'FieldToEncrypt = MyEncryptionFunction.Encrypt(「asdf」);' –

+2

你試過了嗎? SO上有許多類似的答案,表明這可以按照您尋找的方式開箱即用。請參閱http://stackoverflow.com/questions/11962532/what-does-entityframework-code-first-do-with-property-getters-setters和http://stackoverflow.com/questions/8990319/have-a-custom -set-on-property-for-ef-code-first-model-entity – Zeph

+0

你提供的第二個鏈接似乎更接近我所需要的。但是,他正在談論的是「未映射」該領域。我希望該字段仍然映射。我只是希望在數值停留在數據庫之前對映射值進行轉換。 我想我有一個更深的問題,那就是:在EF Code First中,代碼在插入之前/之後調用getter和setter? – Richthofen

回答

4
public class Customer 
{ 
    public int CustomerID { get; set; }   
    public string EncryptedField { get; private set; } 

    [NotMapped] 
    public string Field 
    { 
     get { return MyEncryptionFunction.Decrypt(EncryptedField); } 
     set { EncryptedField = MyEncryptionFunction.Encrypt(value); } 
    } 
} 
+0

好的,但我正在精神上試圖解決GET vs SET。所以當實體框架試圖將數據寫入數據庫時​​,它是否調用對象上的'GET'?如果是這樣,數據庫中的數據將被解密,然後插入到數據庫中。在這個例子中,我擔心數據僅在內存中加密,而不是在持久化時加密。我嘗試了SET語句,它的工作方式令人驚訝,完全是我想要的。 「NotMapped」註釋提供了什麼?它是否告訴框架*不*在數據庫中保留該列?如果是這樣,它不適用於我的例子。 – Richthofen

+0

在本示例中,您將只有兩列數據庫:CustomerID和EncryptedField(帶有加密字段值)。未加密的數據不會存儲在任何地方 - 既不在數據庫中,也不在內存中。 'NotMapped'註釋告訴EF跳過屬性,並且不爲此屬性在數據庫中生成列 –

+0

好的。但是,不是將它分成兩個字段,一個未映射,一個映射,我可以用一個字段進行映射嗎? – Richthofen